Парсер текста [Delphi]
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Парсер текста [Delphi] - 2010-02-07 19:03:32.003333
|
|
|
nub Nik
Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000
|
Народ подскажите, есть массив, допустим со словами: test, hello, world Как сделать так, что бы эти слова выделялись в RichEdit??
|
|
|
RE: Парсер текста [Delphi] - 2010-02-07 19:07:09.676666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Дэлфийский ричэдит регулярные выражения поддерживает? Погугли по ключевым словам "подсветка синтаксиса".
|
|
|
RE: Парсер текста [Delphi] - 2010-02-07 19:12:21.716666
|
|
|
nub Nik
Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000
|
quote:
ORIGINAL: _SaZ_ Дэлфийский ричэдит регулярные выражения поддерживает? хз, мои познания слишком малы, надеюсь светлая сторона силы поможет мне)
|
|
|
RE: Парсер текста [Delphi] - 2010-02-07 19:29:12.530000
|
|
|
sbk
Сообщений: 144
Оценки: 0
Присоединился: 2008-12-20 19:01:57.273333
|
Вики про регулярные выражения.
|
|
|
RE: Парсер текста [Delphi] - 2010-02-07 19:35:09.656666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Вопрос не в том, что это, а поддерживает ли дельфийский компонент поиск и замену регэкспами. Хотя в данном случае это немного перебор. Достаточно найти начало слова, конец слова, выделить, изменить стиль выделенного на требуемый.
|
|
|
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 < 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 > 1 then
begin
WStart := 0;
WEnd := RichEdit1.SelStart;
BCount := WEnd - 1;
while BCount <> 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 > 0 do
begin
WEnd := SearchFor(WorkSpace, ' ', WStart);
WEnd2 := SearchFor(WorkSpace, #$A, WStart);
if WEnd2 < WEnd then WEnd := WEnd2;
SWord := copy(WorkSpace, WStart, WEnd - 1);
if (SWord <> ' ') and (SWord <>'') 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.
|
|
|
RE: Парсер текста [Delphi] - 2010-02-07 19:41:08.833333
|
|
|
nub Nik
Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000
|
Может кто еще подскажет, как сделать что бы слева столбик с нумерацией строк был, как в ++ ??
|
|
|
RE: Парсер текста [Delphi] - 2010-02-07 19:43:46.323333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Ещё раз погугли про подсветку синтаксиса :). Можешь проще свой контрол написать? Просто к ричэдиту будет сложно прикрутить нуперацию строк, поскольку строки могут быть разной высоты, например, на первой строке высота шрифта 10 пт, а на второй 100 пт.
|
|
|
RE: Парсер текста [Delphi] - 2010-02-07 19:50:45.590000
|
|
|
nub Nik
Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000
|
quote:
Можешь проще свой контрол написать? Ты про что, про код? я его в гугле нашел quote:
Просто к ричэдиту будет сложно прикрутить нуперацию строк, поскольку строки могут быть разной высоты, например, на первой строке высота шрифта 10 пт, а на второй 100 пт. Понимаю, но тут слава богу, шрифт одного размера будет
|
|
|
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 Понимаю, но тут слава богу, шрифт одного размера будет А через буфер обмена можно будет текст вставлять? Где гарантия, что "не будет"?
|
|
|
RE: Парсер текста [Delphi] - 2010-02-07 21:11:30.596666
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Могу наврать,но RichEdit вроде поддерживает только всякое интересное форматирование текста,а регулярные выражения - вряд ли. Ээ,а зачем в RichEdit нумерацию? Али других контролов нету? Тут и правда в лоб самое то делать. //ну он запретит вставку текста допустим))
|
|
|
RE: Парсер текста [Delphi] - 2010-02-07 21:59:50.636666
|
|
|
nub Nik
Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000
|
quote:
А через буфер обмена можно будет текст вставлять? Где гарантия, что "не будет"? При вставке, текст сам под размеры подгоняеться)
|
|
|
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 Нужно сделать, такое же поле как и на скрине..
|
|
|
RE: Парсер текста [Delphi] - 2010-02-07 22:37:11.210000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Делай рядом 2 контрола. На одном пиши номера строк, а второй - сам ричэдит.
|
|
|
RE: Парсер текста [Delphi] - 2010-02-08 12:39:10.413333
|
|
|
nub Nik
Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000
|
quote:
ORIGINAL: _SaZ_ Делай рядом 2 контрола. На одном пиши номера строк, а второй - сам ричэдит. Весь прикол в том, что на сколько я знаю, область нумерации находиться в самом ричедите, и при прокрутки скроулинга у него, нумерация, также листаетсья вместе с ним
|
|
|
RE: Парсер текста [Delphi] - 2010-02-08 13:01:13.206666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Что мешает убрать скролл у "нумерации" и скроллить её вместе с ричэдитом? А эти 2 контрола обернуть в 3-й, чтобы всё выглядело как единое целое. Как вариант, можно в ричэдите сделать таблицу из 2-х столбцов. В одном - нумерация, в другом - содержание. Отслеживать попытки изменения нумерации и присекать их. Только не думаю, что это проще ;).
|
|
|
RE: Парсер текста [Delphi] - 2010-02-08 13:40:21.600000
|
|
|
nub Nik
Сообщений: 263
Оценки: 0
Присоединился: 2009-11-18 10:53:00.250000
|
_SaZ_ да, возможно так легче, но так будет правильней К тому же я придется повозиться, что бы они "скроллились" вместе ;) В любом случаи первый вариант лучше подходит
|
|
|
RE: Парсер текста [Delphi] - 2010-02-08 14:31:39.110000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
А чего там возиться? Ловишь скролл эвент на втором контроле и мотаешь на столько же позиций первый.
|
|
|
|
|