怎样在memo或者richedit中实现一个文件中多种颜色或字体显示 ,请举个例子
  我用richedit做了一下  ,调用selstart sellength selattribute.color等做了,但是怪问题很多
我的想法想实现类似delphi的功能 对一些保留字以特殊颜色显示
 请高手帮忙

解决方案 »

  1.   

    以下参考自网上的代码,自己改了一下,可以实现代码着色的功能,但效果不佳
    ,即闪动太厉害,不过也有参考意义:
    procedure CodeColors(Style : String; RichE : TRichedit);
    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;
    FontC, BackC, C1, C2 ,C3 ,strC, strC1 : TColor;
    begin
      with RichE do
      begin
        Font.Name := 'Courier New';
        Font.Size := 10;
        if WordWrap then WordWrap := false;
        SelectAll;
        SelAttributes.color := clBlack;
        SelAttributes.Style := [];
        SelStart := 0;
      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;
      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;
      RichE.SelStart:=length(RichE.Text)-1;
      RichE.setFocus;
    end;
    在RichEdit的OnChange中调用:
    procedure TForm1.RichEdit1Change(Sender: TObject);
    begin
      CodeColors('Default' ,RichEdit1);
    end;
      

  2.   

    抖动问题我自己得程序也遇到过  我想了一个解决方案 memo的改变 哪怕你修改前面行的内容,只会影响到相邻三行的关键字是否自动变色 ,所以我在memochange时先用em_linefromchar取得当前行号然后只循环这行的上一行和下一行 抖动不是很明显  问题时我的selstart的乱用导致光标到处乱跑 出乎我的控制之外  实在无能为力了    谢谢风的解答  50分送你了 呵呵不要嫌少 我总只有100分