|
发表于 2012-6-13 19:55:36
|
显示全部楼层
在 RichEdit 中实现代码着色
贴给你好了,我找到的,试过,很好使。
--------------------------------------
在 RichEdit 中实现代码着色
下面的代码将以指定颜色对一些指定单词着色,就象delphi中的代码编辑器那样。- procedure CodeColors(Form : TForm;Style : String; RichE : TRichedit;
- InVisible : Boolean);
- const
- // 符号...
- CodeC1: array[0..20] of String = ( '# ', '$ ', '( ', ') ', '* ', ', ',
- '. ', '/ ', ': ', '; ', '[ ', '] ', '{ ', '} ', ' < ', '> ',
- '- ', '= ', '+ ', ' ' ' ', '@ ');
- // 保留字...
- CodeC2: array[0..44] 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 [Default,Classic,Twilight,Ocean] ONLY! } ';
- Lines.Insert(0,T);
- StartPos := 0;
- ToEnd := Length(Text) - StartPos;
- FoundAt := FindText(T, StartPos, ToEnd, [stWholeWord]);
- SelStart := FoundAt;
- SelLength := Length(T);
- SelAttributes.Color := clRed;
- SelAttributes.Style := [fsBold];
- StartPos := 0;
- ToEnd := Length(Text) - StartPos;
- FoundAt := FindText( 'ONLY! ', StartPos, ToEnd, [stWholeWord]);
- SelStart := FoundAt;
- SelLength := 4;
- SelAttributes.Color := clRed;
- SelAttributes.Style := [fsBold,fsUnderLine];
- 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, [stWholeWord]);
- 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, [stWholeWord]);
- end;
- end;
- end;
- for i := 0 to 20 do
- begin
- with RichE do
- begin
- StartPos := 0;
- ToEnd := Length(Text) - StartPos;
- FoundAt := FindText(CodeC1[i], StartPos, ToEnd, []);
- while (FoundAt <> -1) do
- begin
- SelStart := FoundAt;
- SelLength := Length(CodeC1[i]);
- SelAttributes.Color := C2;
- StartPos := FoundAt + Length(CodeC1[i]);
- FoundAt := FindText(CodeC1[i], 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[i], StartPos, ToEnd, [stWholeWord]);
- while (FoundAt <> -1) do
- begin
- SelStart := FoundAt;
- SelLength := Length(CodeC2[i]);
- SelAttributes.Color := C3;
- SelAttributes.Style := [fsBold];
- StartPos := FoundAt + Length(CodeC2[i]);
- FoundAt := FindText(CodeC2[i], StartPos, ToEnd, [stWholeWord]);
- 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;
复制代码 |
|