|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Новая проблема. Изменение цвета
Здравствуйте, возникла новая проблема с изменение цвета определённого слова.
Где-то нашёл код, как изменить цвет в ричедите определённого слова. Но мне надо это всё в комбобокс занести, т.е. Человек выбирает в комбобоксе: Ничего либо Красный, либо синий и т.д. Так же этих комбобоксов несколько, один выделяет то слово, другой другое. Дак вот можно ли этот код адаптировать под несколько комбобосксов? Или надо использовать другой, я вот попытался, сделать пока с 2 комбобоксами, но при компиляции сразу же выдаёт ошибку, что-то типа программа обратилась к неправильному адрессу. И указывает на строку: if form8.ComboBox1.ItemIndex <> 0 then begin И не запускает программу. Вот весь код, который я пока сделал на 2 комбобокса, для проверки.. Код:
procedure TForm1.scriptChange(Sender: TObject); const combo1: array[1..3] of string[9] = ('switch','select','case'); combo2: array[1..3] of string[9] = ('getitem','delitem','countitem'); combo3: array[1..1] of string[9] = ('zeny'); combo4: array[1..3] of string[9] = ('mes','next','close'); combo5: array[1..3] of string[9] = ('if','else','end'); combo6: array[1..1] of string[9] = ('""'); var k,i: integer; begin if form8.ComboBox1.ItemIndex <> 0 then begin for i:=1 to length(combo1) do begin k:=-length(combo1[i]); repeat k:=script.FindText(combo1[i],k+length(combo1[i]), length(script.Text)-k-length(combo1[i]),[stWholeWord]); script.SelStart:=k; script.SelLength:=length(combo1[i]); if form8.ComboBox1.ItemIndex = 1 then script.SelAttributes.Color:=clRed; if form8.ComboBox1.ItemIndex = 2 then script.SelAttributes.Color:=clBlue; if form8.ComboBox1.ItemIndex = 3 then script.SelAttributes.Color:=clGreen; if form8.ComboBox1.ItemIndex = 3 then script.SelAttributes.Color:=clYellow; until k < 0; script.SelAttributes.Color:=clBlack; end; end; if form8.ComboBox2.ItemIndex <> 0 then begin for i:=1 to length(combo2) do begin k:=-length(combo2[i]); repeat k:=script.FindText(combo2[i],k+length(combo2[i]), length(script.Text)-k-length(combo2[i]),[stWholeWord]); script.SelStart:=k; script.SelLength:=length(combo2[i]); if form8.ComboBox2.ItemIndex = 1 then script.SelAttributes.Color:=clRed; if form8.ComboBox2.ItemIndex = 2 then script.SelAttributes.Color:=clBlue; if form8.ComboBox2.ItemIndex = 3 then script.SelAttributes.Color:=clGreen; if form8.ComboBox2.ItemIndex = 3 then script.SelAttributes.Color:=clYellow; until k < 0; script.SelAttributes.Color:=clBlack; end; end; end; |
#2
|
|||
|
|||
Юзай свойство OnDrawItem у комбобокса, что бы изменить цвет текста для каждой строки.
|
#3
|
|||
|
|||
Наверное вы не поняли, что мне нужно. Комбобокс, это всеголишь выбор цвета (опция) , в комбобоксе например выбираешь Красный, далее идёт функция, если выбран итем индекс 1 (красный) то в ричедите, фраза меняется на красный..
|
#4
|
|||
|
|||
Закладка Dialogs, компонент ColorDialog тебе поможет.
|
#5
|
|||
|
|||
Ага, спасибо, вот только разобраться бы в нём. Я занёс слова в Кустом Колорс. Выбрал цвет, вот как только сделать, что бы когда в рич едите, что-то менялось (RichEdit1Change) он менял цвет этих слов?
|
#6
|
|||
|
|||
Ты хочешь сделать что-то типа подсветки синтаксиса?
|
#7
|
|||
|
|||
Именно так. Моя программа является программной средой для другого можно сказать языка..
|
#8
|
|||
|
|||
Вот код, давненько писал, он подсвечивает слова в RichEdit-е, его недостаток, он подсвечивает весь текст разом, если ты хочешь что бы слова подсвечивались при вводе или наоборот снимали подсветку при удалении, как в дельфях к примеру, то надо обрабатывать только тот текст, вблизи которого происходят изменения, тогда лаги даже от такого подхода уберутся.
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; const CREZERVWORDS : array [0..9] of String = ('BEGIN','END','IF','THEN','WITH','DO','FOR','AND','TO', 'ELSE'); CWORDSCOLOR = clBlack; CREZERVWORDSCOLOR = clBlack; type TForm1 = class(TForm) RichEdit1: TRichEdit; procedure RichEdit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.RichEdit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); var i,w,sp:Integer; str:String; f:boolean; spos,slen:Integer; begin str:=''; sp:=0; with RichEdit1 do if Length(Text)>0 then begin RichEdit1.Lines.BeginUpdate; spos:=RichEdit1.SelStart; slen:=RichEdit1.SelLength; for i:=1 to Length(Text) do if (Text[i] <> ' ') and (Text[i] <> ';') and (Text[i] <> #13) then str:=str+Text[i] else begin f:=false; for w:=Low(CREZERVWORDS) to High(CREZERVWORDS) do if AnsiUpperCase(str)=CREZERVWORDS[w] then begin f:=true; break; end; SelStart:=sp; SelLength:=i-sp; if f then begin SelAttributes.Color:=CREZERVWORDSCOLOR; SelAttributes.Style:=[fsBold]; end else begin SelAttributes.Color:=CWORDSCOLOR; SelAttributes.Style:=[]; end; sp:=i; str:=''; end; RichEdit1.SelStart:=spos; RichEdit1.SelLength:=slen; SelAttributes.Style:=[]; RichEdit1.SelAttributes.Color:=CWORDSCOLOR; RichEdit1.Lines.EndUpdate; end; end; procedure TForm1.FormShow(Sender: TObject); var Key:Word; begin Key:=0; RichEdit1KeyUp(RichEdit1 , Key, []); end; end. |
#9
|
||||
|
||||
Есть одна беда RichEdita при подсветке синтаксиса - довольно медленная работа с большими документами. Т.е. с документом в 500 строк еще ничего, а вот с 5000 уже начинаются тормоза.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |