实现关键字高亮显示,首先你要作一套识别系统,
识别关键字,输出高亮显示可以用richedit来实现

解决方案 »

  1.   

    贴给你好了,我找到的,试过,很好使。
    --------------------------------------
    在 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;
      

  2.   

    你要真的做到象delphi编辑器那样的话恐怕也只能在如keyperss里判断了,至于着色的方法上面写的很清楚了,不过要实现快速比对恐怕不容易,delphi应该是已经内置的~~~那从trichedit继承下来看看,把那些要高亮显示的内容封装起来。
      

  3.   

    http://www.csdn.net/expert/topic/842/842649.xml?temp=.2619745
    这篇帖子也是讨论这个的,mwedit我没用过,但是用了http://www.delphipages.com/uploads/Editors_Text/richsyntax.zip
    一个字,慢!
      

  4.   

    用RichEdit的HTML编辑器我做过,但感觉用SelStart、SelLength、SelAttributes的办法比较慢,有一个叫cutepage的软件倒很快不知为什么?
      

  5.   

    呵呵,从RICHEDIT的低层写,很快的!
      

  6.   

    从RICHEDIT的低层写,如何做?