Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.08.2010, 14:47
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию Новая проблема. Изменение цвета

Здравствуйте, возникла новая проблема с изменение цвета определённого слова.
Где-то нашёл код, как изменить цвет в ричедите определённого слова. Но мне надо это всё в комбобокс занести, т.е. Человек выбирает в комбобоксе: Ничего либо Красный, либо синий и т.д.
Так же этих комбобоксов несколько, один выделяет то слово, другой другое. Дак вот можно ли этот код адаптировать под несколько комбобосксов? Или надо использовать другой, я вот попытался, сделать пока с 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  
Старый 21.08.2010, 20:22
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Юзай свойство OnDrawItem у комбобокса, что бы изменить цвет текста для каждой строки.
Ответить с цитированием
  #3  
Старый 21.08.2010, 21:40
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Наверное вы не поняли, что мне нужно. Комбобокс, это всеголишь выбор цвета (опция) , в комбобоксе например выбираешь Красный, далее идёт функция, если выбран итем индекс 1 (красный) то в ричедите, фраза меняется на красный..
Ответить с цитированием
  #4  
Старый 22.08.2010, 02:02
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Закладка Dialogs, компонент ColorDialog тебе поможет.
Ответить с цитированием
  #5  
Старый 22.08.2010, 07:20
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Ага, спасибо, вот только разобраться бы в нём. Я занёс слова в Кустом Колорс. Выбрал цвет, вот как только сделать, что бы когда в рич едите, что-то менялось (RichEdit1Change) он менял цвет этих слов?
Ответить с цитированием
  #6  
Старый 22.08.2010, 08:45
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Ты хочешь сделать что-то типа подсветки синтаксиса?
Ответить с цитированием
  #7  
Старый 22.08.2010, 09:07
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Именно так. Моя программа является программной средой для другого можно сказать языка..
Ответить с цитированием
  #8  
Старый 22.08.2010, 09:55
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Вот код, давненько писал, он подсвечивает слова в 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  
Старый 22.08.2010, 13:52
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Есть одна беда RichEdita при подсветке синтаксиса - довольно медленная работа с большими документами. Т.е. с документом в 500 строк еще ничего, а вот с 5000 уже начинаются тормоза.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter