Показать сообщение отдельно
  #9  
Старый 29.05.2013, 08:12
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Когда-то я тоже мучался с этим компонентом. Если не закачивать в него большие тексты, то скорость вполне нормальная. Есть там пара финтов которые существенно ускоряют его работу.
Вот откопал у себя в завалах с примером использования под SQL-синтаксис:
Код:
unit Unit12;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TSynRichEdit = object
   RichEdit: TRichEdit;
   Dic: Array of record Element: String; Color: Integer; end;
   constructor Init(RE: TRichEdit);
   procedure Add(Element: String; Color: Integer);
   procedure Paint;
   procedure CreateSQLDictionary;
   procedure RichEditOnChange(Sender: TObject);
  end;

  TForm12 = class(TForm)
    RichEdit1: TRichEdit;
    procedure FormCreate(Sender: TObject);
  private
    SynRich: TSynRichEdit;
  end;

var
  Form12: TForm12;

implementation

Uses StrUtils;

{$R *.dfm}

procedure TSynRichEdit.CreateSQLDictionary;
begin
 Add('select', clBlue);
 Add('update', clBlue);
 Add('delete', clBlue);
 Add('set', clBlue);
 Add('from', clBlue);
 Add('where', clBlue);
 Add('inner', clBlue);
 Add('left', clBlue);
 Add('right', clBlue);
 Add('union', clBlue);
 Add('order by', clBlue);
 Add('on', clBlue);
 Add('distinct', clBlue);
 Add('top', clBlue);
 Add('having', clBlue);
 Add('group by', clBlue);
 Add('is', clBlue);
 Add('as', clBlue);

 Add('or', clGray);
 Add('and', clGray);
 Add('not', clGray);
 Add('like', clGray);
 Add('join', clGray);
 Add('in', clGray);
 Add('null', clGray);
 Add('(', clGray);
 Add(')', clGray);
 Add('<', clGray);
 Add('>', clGray);
 Add('=', clGray);
 Add('&', clGray);

 Add('count', clRed);
 Add('min', clRed);
 Add('max', clRed);
 Add('datalength', clRed);
 Add('year', clRed);
 Add('getdate', clRed);
 Add('substring', clRed);
 Add('ltrim', clRed);
 Add('rtrim', clRed);

 Add(#39, clGreen);
end;

constructor TSynRichEdit.Init(RE: TRichEdit);
begin
 SetLength(Dic, 0);
 RichEdit := RE;
 RichEdit.OnChange := RichEditOnChange;
end;

procedure TSynRichEdit.Add(Element: String; Color: Integer);
begin
 SetLength(Dic, Length(Dic) + 1);
 Dic[High(Dic)].Element := Element;
 Dic[High(Dic)].Color := Color;
end;

procedure TSynRichEdit.Paint;
var
  i,p,c: Integer;
  e,s: String;
begin
 RichEdit.Lines.BeginUpdate;
 c := RichEdit.SelStart;
 s := AnsiUpperCase(RichEdit.Text);
 s := StringReplace(s,#13#10,'|',[rfReplaceAll]);
 for i := 0 to Length(Dic) - 1
 do begin
    e := AnsiUpperCase(Dic[i].Element);
    if e = #39
    then begin
         p := 1;
         while PosEx(#39, s, p) <> 0
         do begin
            p := PosEx(#39, s, p);
            if PosEx(#39, s, p+1) = 0 then Break;
            RichEdit.SelStart := p;
            p := PosEx(#39, s, p+1)+1;
            RichEdit.SelLength := p-RichEdit.SelStart-2;
            RichEdit.SelAttributes.Color := Dic[i].Color;
            end;
         end
    else begin
         p := 0;
         repeat
          p := PosEx(e, s, p+1);
          if p <> 0
          then if (e[1] in ['(',')','<','=','>','&']) or
                  ((p=1) or not (s[p-1] in ['a'..'z','A'..'Z','0'..'9']) and
                            not (s[p+Length(e)] in ['a'..'z','A'..'Z','0'..'9']))
               then begin
                    RichEdit.SelStart := p-1;
                    RichEdit.SelLength := Length(e);
                    RichEdit.SelAttributes.Color := Dic[i].Color;
                    end;
         until p = 0;
         end;
    end;
 RichEdit.SelStart := c;
 RichEdit.SelAttributes.Color := clBlack;
 RichEdit.Lines.EndUpdate;
end;


procedure TSynRichEdit.RichEditOnChange(Sender: TObject);
begin
 RichEdit.OnChange := nil;
 Paint;
 RichEdit.OnChange := RichEditOnChange;
end;

procedure TForm12.FormCreate(Sender: TObject);
begin
 SynRich.Init(RichEdit1);
 SynRich.CreateSQLDictionary;
end;

end.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием