Цитата:
Сообщение от 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.
А как сделать например чтобы так было
Код:
//Эту строку удалять нельзя
{Эту строку удалять нельзя}
(*Эту строку удалять нельзя*)
что нужно добаить и еще что нужно добавить чтобы указывать жирный текст или нет
|