![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Есть код
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
p:=1;
end;
procedure TForm1.RichEdit1Change(Sender: TObject);
Var ghj:Integer;
begin
for ghj := 0 to Length(Form1.RichEdit1.Text) do begin
if PosEx('Begin',Form1.RichEdit1.Text,p) > 0 then begin
Form1.RichEdit1.SelStart:=PosEx('Begin',Form1.RichEdit1.Text,p)-1;
Form1.RichEdit1.SelLength:=5;
Form1.RichEdit1.SelAttributes.Color:=clBlue;
Form1.RichEdit1.SelStart:=Length(Form1.RichEdit1.Text);
p:=Form1.RichEdit1.SelStart;
Form1.RichEdit1.SelAttributes.Color:=clBlack;
end;
end;Такто работаеет но надо сделать также как это сделан в самой делфи нужно искать строку Begin и красить ее а если у нее после покраски стереть например 1 символ то красить обратно в черный можете помочь |
|
#2
|
||||
|
||||
|
SynEdit (не TRichEdit)
если есть желание вручную - создать словарь, содержащий слова, подлежащие определенному выделению (если правил выделения несколько - несколько словарей или все в одном словаре, но помимо слова еще признак выделения) при отображении пробежать по словарю, если слово есть - выделить, нет - значит нет |
|
#4
|
||||
|
||||
|
Вечерком постараюсь выложить расширенный вариант с шрифтами и обработкой коментариев.
|
|
#5
|
||||
|
||||
|
Исправь также несколько багов
1 В одинарных кавычках кавычки должны тоже красится 2 Допустим написали Select покрасился а если допустим мы у Select стерем букву или добавим к Select ненужную тогда все равно Select или Selec будет покрашен Обрабатывать событие лучше при нажатие на клавиши пробел и стереть. Сделаешь. Буду очень рад. А вот что стоит добавить 1 Полный контроль шрифтам включяя стиль и размер 2 Полная обработка коментариев включая такие [fhfghfg] добавить такие кавычки 'бла бла бла' "бла бла бла" <бла бла бла> |бла бла бла| Лучше для этого сделать компонент по аналагу XpManifest который достаточно положить и он начинает действовать. А вообще есть компоненты которые красят текст который нужно и также как в интерприатарах включая полную поддержку кавычек и коментариев |
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
||||
|
||||
|
Да ему уже популярно объясняли, он все равно на этом позорище делает.
|
|
#8
|
||||
|
||||
|
Цитата:
Врядли в делфи используется 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.А как сделать например чтобы так было Код:
//Эту строку удалять нельзя
{Эту строку удалять нельзя}
(*Эту строку удалять нельзя*)что нужно добаить и еще что нужно добавить чтобы указывать жирный текст или нет Последний раз редактировалось M.A.D.M.A.N., 23.06.2013 в 12:34. |
|
#9
|
||||
|
||||
|
Почему этот код
Код:
procedure TForm2.RED1KeyPress(Sender: TObject; var Key: Char);
var stroca:integer;
i:Integer;
begin
case key of
#32:begin
if Form2.RED1.Text[Length(Form2.RED1.Text)]=#32 then System.exit else begin
stroca:=Length(Form2.RED1.Text);
repeat
stroca:=stroca-1;
until (Form2.RED1.Text[stroca]=#32) or (stroca=0);
Form2.RED1.SelStart:=stroca;
Form2.RED1.SelLength:=Length(Form2.RED1.Text);
for i := 0 to Length(ColorText) do begin
if AnsiUpperCase(Form2.RED1.SelText) = ColorText[i].ColText then begin
Form2.RED1.SelAttributes.Color:=ColorText[i].ColColor;
Form2.RED1.SelAttributes.Style:=ColorText[i].ColFontStyle;
end
else begin
Form2.RED1.SelAttributes.Color:=Form2.FontDialog1.Font.Color;
Form2.RED1.SelAttributes.Style:=Form2.FontDialog1.Font.Style;
end;
Form2.RED1.SelStart:=Length(Form2.RED1.Text);
end;
end;
end;
end;
end;
ColorText[0].ColText:=AnsiUpperCase(PRK1);
ColorText[0].ColColor:=ClBlue;
ColorText[0].ColFontStyle:=[fsbold];
ColorText[1].ColText:=':';
ColorText[1].ColColor:=clGreen;
ColorText[1].ColFontStyle:=[fsBold];
ColorText[2].ColText:='|';
ColorText[2].ColColor:=ClRed;
ColorText[2].ColFontStyle:=[fsBold];
ColorText:Array[0..2] of TColorText;
Type TColorText=record
ColText:String;
ColColor:TColor;
ColFontStyle:TFontStyles;
end;красит только 1 слово Begin |
|
#10
|
||||
|
||||
|
Молодой человек, вы козерог?
|
|
#11
|
||||
|
||||
|
Цитата:
|
|
#12
|
||||
|
||||
|
Я хочу этот код доработать а не писать другой. Способ при том здесь гораздо проще
|