Показать сообщение отдельно
  #5  
Старый 23.06.2013, 09:58
Аватар для AlexandrV
AlexandrV AlexandrV вне форума
Начинающий
 
Регистрация: 10.02.2013
Сообщения: 197
Версия Delphi: XE3
Репутация: -624
По умолчанию

Цитата:
Сообщение от cotseec
SynEdit (не TRichEdit)
если есть желание вручную - создать словарь, содержащий слова, подлежащие определенному выделению (если правил выделения несколько - несколько словарей или все в одном словаре, но помимо слова еще признак выделения) при отображении пробежать по словарю, если слово есть - выделить, нет - значит нет

Врядли в делфи используется SynEdit там RichEdit а не SynEdit. Мне нужно также как это в языках сделано к делфи или паскаль к примеру или например Noteepad++

SynEdit нет в делфи а для XE3 я не могу найти его.

Цитата:
Сообщение от Страдалецъ
Забавно. вы уже третий за месяц, кто спросил про это. Снова даю ссылку на решение стандартными средствами.

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls,StrUtils;
type
  TSynRichEdit = object
   RichEdit: TRichEdit;
   Dic: Array of record Element: String; Color: Integer; FontStyle:TFontStyles end;
   constructor Init(RE: TRichEdit);
   procedure Add(Element: String; Color: Integer;FontStyle:TFontStyles);
   procedure Paint;
   procedure CreateSQLDictionary;
   procedure RichEditOnChange(Sender: TObject);
  end;
type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    SynRich: TSynRichEdit;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  SynRich.Init(RichEdit1);
  SynRich.CreateSQLDictionary;
end;

{ TSynRichEdit }

procedure TSynRichEdit.Add(Element: String; Color: Integer;FontStyle:TFontStyles);
begin
  SetLength(Dic, Length(Dic) + 1);
  Dic[High(Dic)].Element := Element;
  Dic[High(Dic)].Color := Color;
  Dic[High(Dic)].FontStyle:=FontStyle;
end;

procedure TSynRichEdit.CreateSQLDictionary;
begin
  Add('select', clBlue,[fsBold]);
 Add('update', clBlue,[]);
 Add('delete', clBlue,[]);
 Add('set', clBlue,[]);
 Add('from', clBlue,[]);
 Add('where', clBlue,[]);
 Add('inner', clBlue,[]);
 Add('left', clBlue,[]);
 Add('right', clBlue,[]);
 Add('union', clBlue,[]);
 Add('order by', clBlue,[]);
 Add('on', clBlue,[]);
 Add('distinct', clBlue,[]);
 Add('top', clBlue,[]);
 Add('having', clBlue,[]);
 Add('group by', clBlue,[]);
 Add('is', clBlue,[]);
 Add('as', clBlue,[]);

 Add('or', clGray,[]);
 Add('and', clGray,[]);
 Add('not', clGray,[]);
 Add('like', clGray,[]);
 Add('join', clGray,[]);
 Add('in', clGray,[]);
 Add('null', clGray,[]);
 Add('(', clGray,[]);
 Add(')', clGray,[]);
 Add('<', clGray,[]);
 Add('>', clGray,[]);
 Add('=', clGray,[]);
 Add('&', clGray,[]);

 Add('count', clRed,[]);
 Add('min', clRed,[]);
 Add('max', clRed,[]);
 Add('datalength', clRed,[]);
 Add('year', clRed,[]);
 Add('getdate', clRed,[]);
 Add('substring', clRed,[]);
 Add('ltrim', clRed,[]);
 Add('rtrim', clRed,[]);

 Add(#39, clGreen,[]);

 Add('//', clGreen,[]);
end;

constructor TSynRichEdit.Init(RE: TRichEdit);
begin
  SetLength(Dic, 0);
 RichEdit := RE;
 RichEdit.OnChange := RichEditOnChange;
end;

procedure TSynRichEdit.Paint;
var
  i,p,c: Integer;
  e,s: String;
begin
  RichEdit.Lines.BeginUpdate;
 c := RichEdit.SelStart;
 s := AnsiUpperCase(RichEdit.Text);
 s := StringReplace(s,#13#10,'|',[rfReplaceAll]);
 for i := 0 to Length(Dic) - 1
 do begin
    e := AnsiUpperCase(Dic[i].Element);
    if e = #39
    then begin
         p := 1;
         while PosEx(#39, s, p) <> 0
         do begin
            p := PosEx(#39, s, p);
            if PosEx(#39, s, p+1) = 0 then Break;
            RichEdit.SelStart := p;
            p := PosEx(#39, s, p+1)+1;
            RichEdit.SelLength := p-RichEdit.SelStart-2;
            RichEdit.SelAttributes.Color := Dic[i].Color;
            end;
         end
    else begin
         p := 0;
         repeat
          p := PosEx(e, s, p+1);
          if p <> 0
          then if (e[1] in ['(',')','<','=','>','&']) or
                  ((p=1) or not (s[p-1] in ['a'..'z','A'..'Z','0'..'9']) and
                            not (s[p+Length(e)] in ['a'..'z','A'..'Z','0'..'9']))
               then begin
                    RichEdit.SelStart := p-1;
                    RichEdit.SelLength := Length(e);
                    RichEdit.SelAttributes.Color := Dic[i].Color;
                    RichEdit.SelAttributes.Style := Dic[i].FontStyle
                    end;
         until p = 0;
         end;
    end;
 RichEdit.SelStart := c;
 RichEdit.SelAttributes.Color := clBlack;
 RichEdit.SelAttributes.Style := [];
 RichEdit.Lines.EndUpdate;
end;

procedure TSynRichEdit.RichEditOnChange(Sender: TObject);
begin
  RichEdit.OnChange := nil;
 Paint;
 RichEdit.OnChange := RichEditOnChange;
end;

end.

А как сделать например чтобы так было

Код:
//Эту строку удалять нельзя

{Эту строку удалять нельзя}

(*Эту строку удалять нельзя*)

что нужно добаить и еще что нужно добавить чтобы указывать жирный текст или нет
Ответить с цитированием