Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Парсер текста [Delphi]

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Парсер текста [Delphi]
Имя
Сообщение << Старые топики   Новые топики >>
Парсер текста [Delphi] - 2010-02-07 19:03:32.003333   
nub Nik

Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000
Народ подскажите, есть массив, допустим со словами: test, hello, world
Как сделать так, что бы эти слова выделялись в RichEdit??
Post #: 1
RE: Парсер текста [Delphi] - 2010-02-07 19:07:09.676666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Дэлфийский ричэдит регулярные выражения поддерживает?

Погугли по ключевым словам "подсветка синтаксиса".
Post #: 2
RE: Парсер текста [Delphi] - 2010-02-07 19:12:21.716666   
nub Nik

Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000

quote:

ORIGINAL: _SaZ_

Дэлфийский ричэдит регулярные выражения поддерживает?


хз, мои познания слишком малы, надеюсь светлая сторона силы поможет мне)
Post #: 3
RE: Парсер текста [Delphi] - 2010-02-07 19:29:12.530000   
sbk

Сообщений: 144
Оценки: 0
Присоединился: 2008-12-20 19:01:57.273333
Вики про регулярные выражения.
Post #: 4
RE: Парсер текста [Delphi] - 2010-02-07 19:35:09.656666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Вопрос не в том, что это, а поддерживает ли дельфийский компонент поиск и замену регэкспами. Хотя в данном случае это немного перебор.
Достаточно найти начало слова, конец слова, выделить, изменить стиль выделенного на требуемый.
Post #: 5
RE: Парсер текста [Delphi] - 2010-02-07 19:40:01.143333   
nub Nik

Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000
_SaZ_ все, нашел..
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) RichEdit1: TRichEdit; Button1: TButton; OpenDialog1: TOpenDialog; Button2: TButton; procedure RichEdit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure HighLight; function CheckList(InString: string): boolean; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function TForm1.CheckList(InString: string): boolean; const TheList: array[1..13] of string = ('begin', 'or', 'end','end.', 'end;', 'then', 'var', 'for', 'do', 'if', 'to', 'string', 'while'); var X: integer; begin Result := false; X := 1; InString := StringReplace(InString, ' ', '',[rfReplaceAll]); InString := StringReplace(InString, #$A, '',[rfReplaceAll]); InString := StringReplace(InString, #$D, '',[rfReplaceAll]); while X &lt; High(TheList) + 1 do if TheList[X] = lowercase(InString) then begin Result := true; X := High(TheList) + 1; end else inc(X); end; procedure TForm1.RichEdit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); var WEnd, WStart, BCount: integer; Mark: string; begin if (ssCtrl in Shift) and (Key = ord('V')) then Button2Click(Self); if (Key = VK_Return) or (Key = VK_Back) or (Key = VK_Space) then begin if RichEdit1.SelStart &gt; 1 then begin WStart := 0; WEnd := RichEdit1.SelStart; BCount := WEnd - 1; while BCount &lt;&gt; 0 do begin Mark := copy(RichEdit1.Text, BCount, 1); if (Mark = ' ') or (Mark = #$A) then begin WStart := BCount; BCount := 1; end; dec(BCount); end; RichEdit1.SelStart := WEnd - (WEnd - WStart); RichEdit1.SelLength := WEnd - WStart; if CheckList(RichEdit1.SelText) then RichEdit1.SelAttributes.Style := [fsBold] else RichEdit1.SelAttributes.Style := []; RichEdit1.SelStart := WEnd; RichEdit1.SelAttributes.Style := []; end; end; end; function SearchFor(WorkSpace, Search: string; Start: integer): integer; var Temp: string; begin Temp := copy(WorkSpace, Start, length(WorkSpace)); Result := pos(Search, Temp); end; procedure TForm1.HighLight; var WStart, WEnd, WEnd2: integer; WorkSpace, SWord: string; begin WStart := 1; WEnd := 1; with RichEdit1 do begin WorkSpace := Text + ' ' + #$D#$A; while WEnd &gt; 0 do begin WEnd := SearchFor(WorkSpace, ' ', WStart); WEnd2 := SearchFor(WorkSpace, #$A, WStart); if WEnd2 &lt; WEnd then WEnd := WEnd2; SWord := copy(WorkSpace, WStart, WEnd - 1); if (SWord &lt;&gt; ' ') and (SWord &lt;&gt;'') then if CheckList(SWord) then begin SelStart := WStart - 1; SelLength := length(SWord); SelAttributes.Style := [fsBOLD]; SelStart := WStart + length(SWord) + 1; SelAttributes.Style := []; end; WStart := WStart + WEnd; end; SelStart := length(Text); SetFocus; end; end; procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then begin RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName); HighLight; end; end; procedure TForm1.Button2Click(Sender: TObject); begin RichEdit1.PasteFromClipboard; HighLight; end; end.
Post #: 6
RE: Парсер текста [Delphi] - 2010-02-07 19:41:08.833333   
nub Nik

Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000
Может кто еще подскажет, как сделать что бы слева столбик с нумерацией строк был, как в ++ ??
Post #: 7
RE: Парсер текста [Delphi] - 2010-02-07 19:43:46.323333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ещё раз погугли про подсветку синтаксиса :). Можешь проще свой контрол написать? Просто к ричэдиту будет сложно прикрутить нуперацию строк, поскольку строки могут быть разной высоты, например, на первой строке высота шрифта 10 пт, а на второй 100 пт.
Post #: 8
RE: Парсер текста [Delphi] - 2010-02-07 19:50:45.590000   
nub Nik

Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000

quote:

Можешь проще свой контрол написать?

Ты про что, про код? я его в гугле нашел
quote:


Просто к ричэдиту будет сложно прикрутить нуперацию строк, поскольку строки могут быть разной высоты, например, на первой строке высота шрифта 10 пт, а на второй 100 пт.

Понимаю, но тут слава богу, шрифт одного размера будет
Post #: 9
RE: Парсер текста [Delphi] - 2010-02-07 21:09:13.843333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333


quote:

ORIGINAL: nub Nik
Ты про что, про код? я его в гугле нашел

Я про возможности ричэдита.

quote:

ORIGINAL: nub Nik
Понимаю, но тут слава богу, шрифт одного размера будет

А через буфер обмена можно будет текст вставлять? Где гарантия, что "не будет"?
Post #: 10
RE: Парсер текста [Delphi] - 2010-02-07 21:11:30.596666   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
Могу наврать,но RichEdit вроде поддерживает только всякое интересное форматирование текста,а регулярные выражения - вряд ли. Ээ,а зачем в RichEdit нумерацию? Али других контролов нету?
Тут и правда в лоб самое то делать.

//ну он запретит вставку текста допустим))
Post #: 11
RE: Парсер текста [Delphi] - 2010-02-07 21:59:50.636666   
nub Nik

Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000

quote:


А через буфер обмена можно будет текст вставлять? Где гарантия, что "не будет"?

При вставке, текст сам под размеры подгоняеться)
Post #: 12
RE: Парсер текста [Delphi] - 2010-02-07 22:04:47.820000   
nub Nik

Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000
вот, залил на первый поавшийся сайт:
http://xmages.net/show.php/992880_1.gif.html

Нужно сделать, такое же поле как и на скрине..
Post #: 13
RE: Парсер текста [Delphi] - 2010-02-07 22:37:11.210000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Делай рядом 2 контрола. На одном пиши номера строк, а второй - сам ричэдит.
Post #: 14
RE: Парсер текста [Delphi] - 2010-02-08 12:39:10.413333   
nub Nik

Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000

quote:

ORIGINAL: _SaZ_

Делай рядом 2 контрола. На одном пиши номера строк, а второй - сам ричэдит.


Весь прикол в том, что на сколько я знаю, область нумерации находиться в самом ричедите, и при прокрутки скроулинга у него, нумерация, также листаетсья вместе с ним
Post #: 15
RE: Парсер текста [Delphi] - 2010-02-08 13:01:13.206666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Что мешает убрать скролл у "нумерации" и скроллить её вместе с ричэдитом?
А эти 2 контрола обернуть в 3-й, чтобы всё выглядело как единое целое.

Как вариант, можно в ричэдите сделать таблицу из 2-х столбцов. В одном - нумерация, в другом - содержание. Отслеживать попытки изменения нумерации и присекать их. Только не думаю, что это проще ;).
Post #: 16
RE: Парсер текста [Delphi] - 2010-02-08 13:40:21.600000   
nub Nik

Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000
_SaZ_ да, возможно так легче, но так будет правильней
К тому же я придется повозиться, что бы они "скроллились" вместе ;)
В любом случаи первый вариант лучше подходит
Post #: 17
RE: Парсер текста [Delphi] - 2010-02-08 14:31:39.110000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
А чего там возиться? Ловишь скролл эвент на втором контроле и мотаешь на столько же позиций первый.
Post #: 18
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Парсер текста [Delphi]







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.