语法高亮

 

在 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; 
 
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值