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.