Moodsky 发表于 2007-2-8 17:09:12

RichEdit语法高亮

下面的代码将以指定颜色对一些指定单词着色,就象delphi中的代码编辑器那样。

procedure CodeColors(Form : TForm;Style : String; RichE : TRichedit;
                         InVisible : Boolean);
const
// 符号...
CodeC1: array of String = ('#','$','(',')','*',',',
          '.','/',':',';','[',']','{','}','<','>',
          '-','=','+','''','@');
// 保留字...
CodeC2: array of String = ('and','as','begin',
          'case','char','class','const','downto',
          'else','end','except','finally','for',
          'forward','function','if','implementation','interface',
          'is','nil','or','private','procedure','public','raise',
          'repeat','string','to','try','type','unit','uses','var',
          'while','external','stdcall','do','until','array','of',
          'in','shr','shl','cos','div');
var
FoundAt : LongInt;
StartPos, ToEnd, i : integer;
OldCap,T : String;
FontC, BackC, C1, C2 ,C3 ,strC, strC1 : TColor;
begin
OldCap := Form.Caption;
with RichE do
begin
    Font.Name := 'Courier New';
    Font.Size := 10;
    if WordWrap then WordWrap := false;
    SelectAll;
    SelAttributes.color := clBlack;
    SelAttributes.Style := [];
    SelStart := 0;
    if InVisible then
    begin
      Visible := False;
      Form.Caption := 'Executing Code Coloring...';
    end;
end;

BackC := clWhite; FontC := clBlack;
C1 := clBlack; C2 := clBlack; C3 := clBlack;
strC := clBlue; strC1 := clSilver;

if Style = 'Twilight' then
begin
    BackC := clBlack; FontC := clWhite;
    C1 := clLime; C2 := clSilver; C3 := clAqua;
    strC := clYellow; strC1 := clRed;
end
else
if Style = 'Default' then
begin
    BackC := clWhite; FontC := clBlack;
    C1 := clTeal; C2 := clMaroon; C3 := clBlue;
    strC := clMaroon; strC1 := clSilver;
end
else
if Style = 'Ocean' then
begin
    BackC := $00FFFF80; FontC := clBlack;
    C1 := clMaroon; C2 := clBlack; C3 := clBlue;
    strC := clTeal; strC1 := clBlack;
end
else
if Style = 'Classic' then
begin
    BackC := clNavy; FontC := clYellow;
    C1 := clLime; C2 := clSilver; C3 := clWhite;
    strC := clAqua; strC1 := clSilver;
end
else
begin
    with RichE do
    begin
      T := '{'+Style+' = Invalid Style ONLY! }';
      Lines.Insert(0,T);
      StartPos := 0;
      ToEnd := Length(Text) - StartPos;
      FoundAt := FindText(T, StartPos, ToEnd, );
      SelStart := FoundAt;
      SelLength := Length(T);
      SelAttributes.Color := clRed;
      SelAttributes.Style := ;
      StartPos := 0;
      ToEnd := Length(Text) - StartPos;
      FoundAt := FindText('ONLY!', StartPos, ToEnd, );
      SelStart := FoundAt;
      SelLength := 4;
      SelAttributes.Color := clRed;
      SelAttributes.Style := ;
    end;
end;

RichE.SelectAll;
RichE.color := BackC;
RichE.SelAttributes.color := FontC;

for i := 0 to 100 do
begin
    with RichE do
    begin
      StartPos := 0;
      ToEnd := Length(Text) - StartPos;
      FoundAt := FindText(IntToStr(i), StartPos, ToEnd, );
      while (FoundAt <> -1) do
      begin
      SelStart := FoundAt;
      SelLength := Length(IntToStr(i));
      SelAttributes.Color := C1;
      SelAttributes.Style := [];
      StartPos := FoundAt + Length(IntToStr(i));
      FoundAt := FindText(IntToStr(i), StartPos, ToEnd, );
      end;
    end;
end;
for i := 0 to 20 do
begin
    with RichE do
    begin
      StartPos := 0;
      ToEnd := Length(Text) - StartPos;
      FoundAt := FindText(CodeC1, StartPos, ToEnd, []);
      while (FoundAt <> -1) do
      begin
      SelStart := FoundAt;
      SelLength := Length(CodeC1);
      SelAttributes.Color := C2;
      StartPos := FoundAt + Length(CodeC1);
      FoundAt := FindText(CodeC1, StartPos, ToEnd, []);
      end;
    end;
end;
for i := 0 to 44 do
begin
    with RichE do
    begin
      StartPos := 0;
      ToEnd := Length(Text) - StartPos;
      FoundAt := FindText(CodeC2, StartPos, ToEnd, );
      while (FoundAt <> -1) do
      begin
      SelStart := FoundAt;
      SelLength := Length(CodeC2);
      SelAttributes.Color := C3;
      SelAttributes.Style := ;
      StartPos := FoundAt + Length(CodeC2);
      FoundAt := FindText(CodeC2, StartPos, ToEnd, );
      end;
    end;
end;
Startpos := 0;
with RichE do
begin
    FoundAt := FindText('''', StartPos, Length(Text), []);
    while FoundAt <> -1 do
    begin
      SelStart := FoundAt;
      Startpos := FoundAt+1;
      FoundAt := FindText('''', StartPos, Length(Text), []);
      if FoundAt <> -1 then
      begin
      SelLength := (FoundAt - selstart)+1;
      SelAttributes.Style := [];
      SelAttributes.Color := strC;
      StartPos := FoundAt+1;
      FoundAt := FindText('''', StartPos, Length(Text), []);
      end;
    end;
end;

Startpos := 0;
with RichE do
begin
    FoundAt := FindText('{', StartPos, Length(Text), []);
    while FoundAt <> -1 do
    begin
      SelStart := FoundAt;
      Startpos := FoundAt+1;
      FoundAt := FindText('}', StartPos, Length(Text), []);
      if FoundAt <> -1 then
      begin
      SelLength := (FoundAt - selstart)+1;
      SelAttributes.Style := [];
      SelAttributes.Color := strC1;
      StartPos := FoundAt+1;
      FoundAt := FindText('{', StartPos, Length(Text), []);
      end;
    end;
end;   

if InVisible then
begin
    RichE.Visible := True;
    Form.Caption := OldCap;
end;
RichE.SelStart := 0;
end;

xiaohong255 发表于 2008-6-30 21:38:19

回复 1# 的帖子

楼主好厉害,顶一下
页: [1]
查看完整版本: RichEdit语法高亮