语法高亮

2008-04-10 02:58:12来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

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

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:用程序模拟键盘和鼠标键盘

下一篇:升级到Delphi 6 - 兼容性问题之三(完)