|
|
Регистрация | << Правила форума >> | 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)
если есть желание вручную - создать словарь, содержащий слова, подлежащие определенному выделению (если правил выделения несколько - несколько словарей или все в одном словаре, но помимо слова еще признак выделения) при отображении пробежать по словарю, если слово есть - выделить, нет - значит нет Понять, что хочет заказчик - бесценно, ведь он платит MasterCard |
#3
|
||||
|
||||
Забавно. вы уже третий за месяц, кто спросил про это. Снова даю ссылку на решение стандартными средствами.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#4
|
||||
|
||||
Да ему уже популярно объясняли, он все равно на этом позорище делает.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
||||
|
||||
Цитата:
Врядли в делфи используется 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. |
#6
|
||||
|
||||
Вечерком постараюсь выложить расширенный вариант с шрифтами и обработкой коментариев.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
||||
|
||||
Исправь также несколько багов
1 В одинарных кавычках кавычки должны тоже красится 2 Допустим написали Select покрасился а если допустим мы у Select стерем букву или добавим к Select ненужную тогда все равно Select или Selec будет покрашен Обрабатывать событие лучше при нажатие на клавиши пробел и стереть. Сделаешь. Буду очень рад. А вот что стоит добавить 1 Полный контроль шрифтам включяя стиль и размер 2 Полная обработка коментариев включая такие [fhfghfg] добавить такие кавычки 'бла бла бла' "бла бла бла" <бла бла бла> |бла бла бла| Лучше для этого сделать компонент по аналагу XpManifest который достаточно положить и он начинает действовать. А вообще есть компоненты которые красят текст который нужно и также как в интерприатарах включая полную поддержку кавычек и коментариев |
#8
|
||||
|
||||
Цитата:
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard |
#9
|
||||
|
||||
Можете ктонибудь ссылку на SynEdit дать для XE3 только не через SVN а обычную желательно торрент
|
#10
|
||||
|
||||
при попытки откомпелировать SynEdit от XE2 на XE3 вот что в ответ
Код:
[dcc32 Fatal Error] SynEdit_RXE2.dpk(30): E2225 Never-build package 'designide' must be recompiled [dcc32 Fatal Error] SynEdit_DXE2.dpk(35): E2202 Required package 'SynEdit_RXE2' not found C:\SynEdit\branches\CodeFolding\SynEdit\Packages\SynEdit_RXE2.dpk(30,2): error F2225: E2225 Never-build package 'designide' must be recompiled C:\SynEdit\branches\CodeFolding\SynEdit\Packages\SynEdit_DXE2.dpk(35): error F2202: E2202 Required package 'SynEdit_RXE2' not found |
#11
|
||||
|
||||
Сбилди dpk`шки, он же так и пишет. Просто добавляешь их в группу проектов и билдишь.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#12
|
||||
|
||||
Цитата:
Можно подробнее. Это он пишет при попытки компиляции DPK. пути к DPK и к PAS прописаны |
#13
|
||||
|
||||
Цитата:
Добавил все 2 дпк в группу проектов и вот что потом. Код:
[dcc32 Warning] SynEditTextBuffer.pas(133): W1010 Method 'GetCapacity' hides virtual method of base type 'TStrings' [dcc32 Warning] SynEditTextBuffer.pas(140): W1010 Method 'SetCapacity' hides virtual method of base type 'TStrings' [dcc32 Error] SynUnicode.pas(1679): E2010 Incompatible types: 'AnsiChar' and 'Char' [dcc32 Error] SynUnicode.pas(1686): E2010 Incompatible types: 'AnsiChar' and 'Char' [dcc32 Error] SynUnicode.pas(1687): E2010 Incompatible types: 'AnsiChar' and 'Char' [dcc32 Error] SynUnicode.pas(1688): E2010 Incompatible types: 'AnsiChar' and 'Char' [dcc32 Error] SynUnicode.pas(1695): E2010 Incompatible types: 'AnsiChar' and 'Char' [dcc32 Error] SynUnicode.pas(1696): E2010 Incompatible types: 'AnsiChar' and 'Char' [dcc32 Warning] SynUnicode.pas(1803): W1044 Suspicious typecast of UTF8String to PAnsiChar [dcc32 Warning] SynUnicode.pas(1820): W1044 Suspicious typecast of UTF8String to PAnsiChar [dcc32 Warning] SynUnicode.pas(1842): W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString' [dcc32 Warning] SynUnicode.pas(1843): W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString' [dcc32 Warning] SynUnicode.pas(1857): W1000 Symbol 'RaiseLastWin32Error' is deprecated: 'Use RaiseLastOSError' [dcc32 Warning] SynUnicode.pas(1870): W1000 Symbol 'RaiseLastWin32Error' is deprecated: 'Use RaiseLastOSError' [dcc32 Warning] SynUnicode.pas(3169): W1058 Implicit string cast with potential data loss from 'UTF8String' to 'RawByteString' [dcc32 Fatal Error] SynTextDrawer.pas(1874): F2063 Could not compile used unit 'SynUnicode.pas' Дело в том что эта для языка XE2 а у меня XE3 кажется D18 должен подойти если не ошибаюсь но его нет в пакете SynEdit есть нормальный SynEdit для XE3 Последний раз редактировалось M.A.D.M.A.N., 24.06.2013 в 09:52. |
#14
|
||||
|
||||
Хватит из темы делать чат, пользуйтесь правкой сообщений.
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#15
|
||||
|
||||
Молодой человек, вы не пробовали сначала посидеть, поковыряться, погуглиться, демки посмотреть, а уж потом какать в теме?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |