语法高亮

类别:Delphi 点击:0 评论:0 推荐:

 

在 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;  

本文地址:http://com.8s8s.com/it/it5963.htm