我要写一个sql 编辑器,请问sql语言的高亮显示如何实现~?下载了synedit 和mwedit 两个控件,都是由原码的,但是,懒得看,请问那位高手做过相应的东西,请指教。

解决方案 »

  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;