Поиск по содержимому Memo

Здрасте. Как осуществить поиск по полю MEMO? Например есть поле MEMO, с текстом книги, нужно сделать так, чтобы был поиск по етому полю и виводился номер символа первой буквы искомого слова неучитывая пробелы.
9 ответов

const
  StrTempl = 'Искомый шаблон';
var
  Pos1 : Integer;
begin
  Pos1 := Pos(StrTempl, Memo1.Text);
  if Pos1 > 0 then begin
    ShowMessage('Шаблон найден в позиции = ' + IntToStr(Pos1));
  end else begin
    ShowMessage('Шаблон не найден');
  end;
Если требуется показать координаты - номер строки Мемо + номер позиции в строке, тогда, если выполняется условие, что искомый шаблон не переносится между строками, можно действовать так:
const
  StrTempl = 'Искомый шаблон';
var
  i, Line, Pos1 : Integer;
begin
  Pos1 := 0;
  for i := 0 to Memo1.Lines.Count - 1 do begin
    Pos1 := Pos(StrTempl, Memo1.Lines[i]);
    if Pos1 > 0 then begin
      Line := i;
      Break;
    end;
  end;
  if Pos1 > 0 then begin
    //IntToStr(Line + 1) - потому что строки в Мемо индексируются от нуля.
    //А пользователь скорее всего захочет видеть строки, нумерующиеся от единицы.
    ShowMessage(
      'Шаблон найден по координтам: ' + Char(10)
      + 'строка = ' + IntToStr(Line + 1) + Char(10)
      + 'позиция = ' + IntToStr(Pos1)
     );
  end else begin
    ShowMessage('Шаблон не найден');
  end;


А как сделать чтобы етот поиск выполнялся с помощю TFindDialog?


dimafe6, создай форму, назови ее как тебе угодно, и вызывай перед поиском, а после необходимых настроек пользаком(после закрытия формы) начинай поиск...


С TFindDialog:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not FindDialog1.Execute then Exit;
end;
 
procedure TForm1.FindDialog1Find(Sender: TObject);
var
  i, Line, Pos1 : Integer;
  StrTempl : String;
begin
  StrTempl := FindDialog1.FindText;
 
  Pos1 := 0;
  for i := 0 to Memo1.Lines.Count - 1 do begin
    Pos1 := Pos(StrTempl, Memo1.Lines[i]);
    if Pos1 > 0 then begin
      Line := i;
      Break;
    end;
  end;
  if Pos1 > 0 then begin
    //IntToStr(Line + 1) - потому что строки в Мемо индексируются от нуля.
    //А пользователь скорее всего захочет видеть строки, нумерующиеся от единицы.
    ShowMessage(
      'Шаблон найден по координтам: ' + Char(10)
      + 'строка = ' + IntToStr(Line + 1) + Char(10)
      + 'позиция = ' + IntToStr(Pos1)
     );
  end else begin
    ShowMessage('Шаблон не найден');
  end;
end;


Спасибо Mawrat, а не подскажешь как работать с TProgresBar? Например результат Line отображался на баре в процентах от общего количества символов.


Для TProgressBar надо задать значения полей: Min, Max, Step. А затем после каждой просмотреной строки в Мемо, менять значение поля Position. Схематично так:
procedure TForm1.FindDialog1Find(Sender: TObject);
var
  i, Line, Pos1 : Integer;
  StrTempl : String;
begin
  //Инициализация Прогресс бара.
  ProgressBar.Min := 0;
  ProgressBar.Max := Memo1.Lenes.Count - 1;
  ProgressBar.Step := 1;
  ProgressBar.Position := 0;
 
  StrTempl := FindDialog1.FindText;
 
  Pos1 := 0;
  for i := 0 to Memo1.Lines.Count - 1 do begin
    ProgressBar1.Position := ProgressBar1.Position + ProgressBar1.Step;
    Pos1 := Pos(StrTempl, Memo1.Lines[i]);
    if Pos1 > 0 then begin
      Line := i;
      Break;
    end;
  end;
  if Pos1 > 0 then begin
    //IntToStr(Line + 1) - потому что строки в Мемо индексируются от нуля.
    //А пользователь скорее всего захочет видеть строки, нумерующиеся от единицы.
    ShowMessage(
      'Шаблон найден по координтам: ' + Char(10)
      + 'строка = ' + IntToStr(Line + 1) + Char(10)
      + 'позиция = ' + IntToStr(Pos1)
     );
  end else begin
    ShowMessage('Шаблон не найден');
  end;
end;


procedure TForm1.FindDialog1Find(Sender: TObject);
пишет ошибку: [Pascal Error] Unit1.pas(36): E2003 Undeclared identifier: 'FindDialog1Find'


Сначала надо на форме выделить компонент TFindDialog. Затем, нажать F11 - появится окно диспетчера объектов. В этом окне надо перейти на закладку Events. На этой закладке есть строка с заголовком OnFind. С помощью двойного щелчка по этой строке будет создан обрабочик события OnFind для компонента TFindDialog. Этим обрабочиком как раз будет процедура: procedure TForm1.FindDialog1Find(Sender: TObject); Её код надо оформить так:
procedure TForm1.FindDialog1Find(Sender: TObject);
var
  i, Line, Pos1 : Integer;
  StrTempl : String;
begin
  //Инициализация Прогресс бара.
  ProgressBar.Min := 0;
  ProgressBar.Max := Memo1.Lenes.Count - 1;
  ProgressBar.Step := 1;
  ProgressBar.Position := 0;
 
  StrTempl := FindDialog1.FindText;
 
  Pos1 := 0;
  for i := 0 to Memo1.Lines.Count - 1 do begin
    ProgressBar1.Position := ProgressBar1.Position + ProgressBar1.Step;
    Pos1 := Pos(StrTempl, Memo1.Lines[i]);
    if Pos1 > 0 then begin
      Line := i;
      Break;
    end;
  end;
  if Pos1 > 0 then begin
    //IntToStr(Line + 1) - потому что строки в Мемо индексируются от нуля.
    //А пользователь скорее всего захочет видеть строки, нумерующиеся от единицы.
    ShowMessage(
      'Шаблон найден по координтам: ' + Char(10)
      + 'строка = ' + IntToStr(Line + 1) + Char(10)
      + 'позиция = ' + IntToStr(Pos1)
     );
  end else begin
    ShowMessage('Шаблон не найден');
  end;
end;


а как сделать чтобы однаковые слова находились по очереди? тоесть: найти далее