0 / 0 / 3
Регистрация: 31.05.2012
Сообщений: 81
1

Подсветка слов при написании в компоненте RichEdit

19.04.2013, 15:27. Показов 4845. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, в процессе работы над заданием по выделению слов из указанного массива цветом при написании, появились трудности. Цветовое преобразование наступает после прохождения курсора до конца слова и нажатия пробела, как изменить код, для получения результата сразу при написании, исключая необходимость ввода пробела;
по тому алгоритму, что приведен ниже, наблюдаются ошибки такого типа: (загруженная картинка)
Подсветка слов при написании в компоненте RichEdit

подскажите,как усовершенствовать программку?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
unit Unit123;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;
 
type
  TForm2 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    RichEdit1: TRichEdit;
    procedure Button1Click(Sender: TObject);
    procedure RichEdit1keyup(sender: tobject; var key: word; shift: tshiftstate);
    procedure highlight;
    function checklist(instring: string): boolean;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.dfm}
 
procedure TForm2.Button1Click(Sender: TObject);
begin
if opendialog1.execute then
begin
richedit1.lines.loadfromfile(opendialog1.filename);
highlight;
end;
end;
 
 
function TForm2.checklist(instring: string): boolean;
const thelist: array[1..9] of string = ('begin', 'or', 'end', 'then', 'var', 'for', 'do', 'if', 'while');
var x: integer; 
begin 
result := false;
x := 1; 
instring := stringreplace(instring, ' ', '',[rfreplaceall]); 
instring := stringreplace(instring, #$a, '',[rfreplaceall]); 
instring := stringreplace(instring, #$d, '',[rfreplaceall]); 
while x < high(thelist) + 1 do
if thelist[x] = lowercase(instring) then 
begin 
result := true; 
x := high(thelist) + 1;
end 
else inc(x); 
end;
 
procedure TForm2.RichEdit1keyup(sender: tobject; var key: word; shift: tshiftstate);
var wend, wstart, bcount: integer;
mark: string;
begin
if (key = vk_return) or (key = vk_back) or (key = vk_space) then
begin 
if richedit1.selstart > 1 then   //если позиция курсора не нулевая
begin
wstart := 0;  //задали начало выделения (нулевая позиция)
wend := richedit1.selstart; //задали конец выделения(текущая позиция курсора)
bcount := wend - 1;    //задаём счётчик для следующего цикла
while bcount <> 0 do     //данным циклом выделили позиции начала и конца того слова
begin   //которое только что ввели
mark := copy(richedit1.text, bcount, 1);
if (mark = ' ') or (mark = #$a) then
begin 
wstart := bcount; 
bcount := 1; 
end; 
dec(bcount);
end; 
richedit1.selstart := wend - (wend - wstart);
richedit1.sellength := wend - wstart;    //выделили слово которое только что ввели
if checklist(richedit1.seltext)
//если при выполнении функции CheckList,
//InString которого = RichEdit1.SelText
//получаем true то:
then 
highlight //жирный шрифт, синий цвет
else richedit1.selattributes.style := []; //иначе, переместили курсор в конец 
richedit1.selattributes.Color := clBlack; //введённого (проверяемого) слова и 
richedit1.selstart := wend;  //сделали последующий текст обычным
end;
end;
end;
 
function searchfor(workspace, search: string; start: integer): integer;
var temp: string;
begin
temp := copy(workspace, start, length(workspace));
result := pos(search, temp);
end; 
 
procedure TForm2.highlight;
var wstart, wend, wend2,wend3: integer;
workspace, sword: string;
begin 
wstart := 1;
wend := 1; 
with richedit1 do 
begin 
workspace := text + ' ' + #$d#$a; 
while wend > 0 do
begin
wend := searchfor(workspace, ' ', wstart);
wend2 := searchfor(workspace, #$a, wstart);
//wend3 := searchfor(workspace, , wstart);
if wend2 < wend then wend := wend2;
sword := copy(workspace, wstart, wend - 1);
if (sword <> ' ') and (sword <>'') then
if checklist(sword) then
begin
selstart := wstart - 1;
sellength := length(sword); 
selattributes.style := [fsbold];
selattributes.Color := clHotLight;
selstart := wstart + length(sword) + 1;
selattributes.style := [];
selattributes.Color := clBlack;
end;
wstart := wstart + wend;
end;
selstart := length(text);
setfocus;
end; 
end; 
 
end.

Сам проект:
Вложения
Тип файла: rar выделение цветом.rar (224.4 Кб, 56 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2013, 15:27
Ответы с готовыми решениями:

Вычеркнуть из слов Х и Y буквы, одновременно используемые при написании каждого из этих слов
те буквы, что одновременно используются при написании каждого из этих слов.

Как удалить из слов X и Y те буквы, что одновременно используются при написании каждого из этих слов
Составьте программу, вычеркивающую из слов X и Y те буквы,что одновременно используются при...

Кодировка слов в базе и при написании в форме
Задача такая: У меня в базе два слова: русское и его перевод. В textbox3 выводится русское слово...

Выравнивание строки в компоненте RichEdit
Необходимо выровнять по центру строку в компоненте RichEdit. Например: 1-я строка по левому краю;...

23
0 / 0 / 3
Регистрация: 31.05.2012
Сообщений: 81
30.05.2013, 00:24  [ТС] 21
Author24 — интернет-сервис помощи студентам
Сегодня препод посоветовал изменения цветом осуществлять после употребления к примеру функции richedit1.DragCursor, на изменение блока проверки под шаблон, или что-нибудь в этом роде. Не совсем поняла как это осуществить, подскажите.) Решение есть, пусть и реализовать нужно без использования других компонентов типа synEdit.
0
angstrom
30.05.2013, 00:44 22
Вариант от Страдалецъ-а не пробовала?
0 / 0 / 3
Регистрация: 31.05.2012
Сообщений: 81
30.05.2013, 00:50  [ТС] 23
Цитата Сообщение от angstrom Посмотреть сообщение
Вариант от Страдалецъ-а не пробовала?
Работает, но препод настаивает на прежних условиях задачи, не сдача
0
angstrom
30.05.2013, 00:57     Подсветка слов при написании в компоненте RichEdit
  #24

Не по теме:


Тогда пусть даёт свой код и не выпендривается. Сколько программистов, столько и решений задачи, и никто не доказал, что его решение самое лучшее.

IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2013, 00:57

Подсветка синтаксиса в RichEdit
Доброго времени суток. Пишу текстовый редактор с подсветкой синтаксиса хтмл. подскажите как этот...

Подсветка синтаксиса в RichEdit
Здравствуйте ВСЕ, Подскажите пожалуйста, как реализовать сабж? Заранее спасибо.

Подсветка синтаксиса в RichEdit
Хочу подсветить html разметку без всяких специальных компонентов через RichEdit (для начала хотя...

Подсветка синтаксиса в RichEdit
Доброго времени суток! Как можно в RichEdit реализовать подсветку синтаксиса HTML например?...

Подсветка синтаксиса RichEdit
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt;...

Подсветка синтаксиса RichEdit
Всем доброго времени суток. Кто в курсе почему не получается вот с таким кодом: void __fastcall...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru