Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск через TRegExpr 
:(
    Опции темы
mr.Anderson
Дата 6.8.2007, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Я использую класс TRegExpr для работы с регулярными выражениями. Если вы работали с этим компонентом, то прошу помочь с поиском.

Я пытаюсь организовать поиск следующим образом. Кладу на форму TFindDialog, называю "DFind". В обработчике OnFind пишу:
Код

var
 RegExpr : TRegExpr;
begin
 RegExpr := TRegExpr.Create();
 RegExpr.Expression := DFind.FindText;

 if( frDown in DFind.Options ) then
  RegExpr.InputString := AnsiRightStr( RichEdit1.Lines.Text, Length(RichEdit1.Lines.Text)-RichEdit1.SelStart )
 else RegExpr.InputString := AnsiLeftStr( RichEdit1.Lines.Text, RichEdit1.SelStart );

 if( RegExpr.Exec() ) then
 begin
  RichEdit1.SelStart := RegExpr.MatchPos[ 0 ];
  RichEdit1.SelLength := RegExpr.MatchLen[ 0 ];
 end
 else MessageBox( 0, 'Указанное выражение не обнаружено!', 'Поиск', MB_ICONINFORMATION );
end;

Однако, данный код выделяет мне текст на 1 символ правее, чем надо. Исправление типа
Код

RichEdit1.SelStart := RegExpr.MatchPos[ 0 ] - 1;

Ни к чему не приводит. В смысле, текст-то выделяется правильно, зато начинаются глюки при поиске в противоположном направлении (выделяется не тот фрагмент, ищется не пойми что). В чем проблема? Никак не разберусь. Плюс надо как-то реализовать "Найти далее", но как - не могу понять.

Кто-нибудь может помочь?

Это сообщение отредактировал(а) mr.Anderson - 6.8.2007, 21:35


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
dumb
Дата 7.8.2007, 04:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 3
Всего: 158



первое, что в голову пришло. smile самому не нравится, но вроде пашет:
Код

type
  FindItem = record
    iPos: Integer;
    iLen: Integer;
  end;
var
  FindCount   : Integer;
  FindCurrent : Integer;
  FindArray   : array of FindItem;
  FindString  : String = '';

procedure TForm1.DFindFind(Sender: TObject);
var
 i, rPos: Integer;
 RegExpr : TRegExpr;
begin
  if (DFind.FindText <> FindString) then
  begin
    FindCount := 0;
    FindCurrent := -1;
    RegExpr := TRegExpr.Create();
    RegExpr.ModifierR := true;
    FindString := DFind.FindText;
    RegExpr.Expression := DFind.FindText;
    RegExpr.InputString := RichEdit1.Lines.Text;
    if RegExpr.Exec then
      repeat
        Inc(FindCount);
        SetLength(FindArray, FindCount);
        FindArray[FindCount-1].iPos := RegExpr.MatchPos[0] - 1;
        FindArray[FindCount-1].iLen := RegExpr.MatchLen[0];
      until not RegExpr.ExecNext;
    RegExpr.Free;
  end;
  if (FindCount <= 0) then begin
    MessageBox( DFind.Handle, 'Указанное выражение не обнаружено!', 'Поиск', MB_ICONINFORMATION );
    Exit;
  end;
  rPos := RichEdit1.SelStart;
  if ( frDown in DFind.Options ) then begin
    i := 0;
    while (i < FindCount) and (FindArray[i].iPos <= rPos) do Inc(i);
  end else begin
    i := FindCount - 1;
    while (i >= 0) and (FindArray[i].iPos >= rPos) do Dec(i);
  end;
  if (i = FindCurrent) then
    if frDown in DFind.Options then Inc(i) else Dec(i);
  FindCurrent := i;
  if (i >= 0) and (i < FindCount) then begin
    RichEdit1.SelStart := FindArray[i].iPos;
    RichEdit1.SelLength := FindArray[i].iLen;
  end
  else
    MessageBox( DFind.Handle, 'Указанное выражение не обнаружено!', 'Поиск', MB_ICONINFORMATION );
end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0893 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.