Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Поиск


Автор: Victor 8.2.2004, 17:05
Люди как быть
Код

procedure TForm1.FindClick(Sender: TObject);
begin
Finddialog1.Execute;
end;

procedure TForm1.FindDialog1Find(Sender: TObject);
begin
if pos(finddialog1.FindText,Richedit1.Text)<>0 then
 begin
  Richedit1.HideSelection:=false;
  Richedit1.SelStart:=pos(Finddialog1.FindText,Richedit1.Text)-1;
  Richedit1.SelLength:=Length(Finddialog1.FindText);
  end
 else MessageDlg('Строка ' + FindDialog1.FindText + ' ненайдена!', mtConfirmation, [mbyes],0);

end;

Поиск работает, но мне надо
1)Чтобы если я несколько раз попрошу найти тот или иной текст т.е я тыркаю кнопку Найти она только 1 раз работает
2)А как ещё заменить на текст который я ввел в поиске
?

Автор: dm9 9.2.2004, 01:43
1. "Не" с глаголами пишется раздельно.

2. Ответ на первый вопрос:
Код
procedure TForm1.FindDialog1Find(Sender: TObject);
var X : Word;
begin
  X := Pos (FindDialog1.FindText,
            Copy (Richedit1.Text,
                  Richedit1.SelStart + 1 + Richedit1.SelLength,
                  Length(Richedit1.Text) - Richedit1.SelStart - Richedit1.SelLength));
  if X <> 0
  then
  begin
     RichEdit1.HideSelection := false;
     RichEdit1.SelStart := X + Richedit1.SelStart + Richedit1.SelLength - 1;
     RichEdit1.SelLength := Length (Finddialog1.FindText);
  end
  else
     MessageDlg('Строка ' + FindDialog1.FindText + ' не найдена!', mtConfirmation, [mbyes], 0);
end;

Работает поиск вниз начиная с позиции курсора. Поиск вверх делаешь аналогично, добавить только одно условие.

3. Ответ на второй вопрос: там рядом кнопочка ReplaceDialog.

Автор: December 9.2.2004, 02:38
Victor Возможно там ещё такая фишка есть: чтобы Ричедит доскроллился до позиции курсора, нужно делать perform(EM_ScrollCaret,0,0);

Автор: Victor 9.2.2004, 09:38
December да вроде сам скролллится
dm9 спасибо конечно, но немог бы ты сделать коментарии я никак непойму эту функцию Pos, смотрел в хелпе тама

function Pos(Substr: string; S: string): Integer;

Description

Pos searches for a substring, Substr, in a string, S. Substr and S are string-type expressions.

Pos searches for Substr within S and returns an integer value that is the index of the first character of Substr within S. Pos is case-sensitive. If Substr is not found, Pos returns zero

Но я непойму где ты сделал чтобы все время можно было искатать и где проверка кнопки вверх/вниз чтоли, если что-то менять то он будет искать только вверх или как ?
sad.gif

Автор: dm9 9.2.2004, 12:14
Ф-ция Pos (SubS, S : String) : Integer;

ищет первую подстроку SubS в строке S и возвращает номер символа, с которого начинается эа подстрока. Если подстрока не найдена, возвращается ноль. Нумерация символов - с единицы.

Пример.
SubS := 'bc';
S := 'abcdefg';
X := Pos (SubS, S); //Вернёт 2

SubS := 'bc';
S := 'asdbcbcbcbc';
X := Pos (SubS, S); //Вернёт 4

У меня проверки вверх/вниз нету, всё время ищет вниз.

Более подробно если надо, распишу чуть позже.

Автор: Paradox 9.2.2004, 12:31
Цитата
SubS := 'asdbcbcbcbc';
S := 'bc';
X := Pos (SubS, S); //Вернёт 2

Имелось ввиду что вернет 0 наверное

Автор: dm9 9.2.2004, 14:44
Сорри, я в примерах лажу написал. Торопился очень. Всё исправил.

Автор: Victor 9.2.2004, 15:07
А про Copy и что тама дальше можеш объяснить, SelStart я так понимаю это где начинаеться выделение строки или типа того, а sellength это длина выделенного текста или как?
Pos (FindDialog1.FindText,
Copy (Richedit1.Text,
Richedit1.SelStart + 1 + Richedit1.SelLength,
Length(Richedit1.Text) - Richedit1.SelStart - Richedit1.SelLength));
и что это:
Richedit1.HideSelection:=false;
я в хелпе смотрел, жалуюсь на свой инглиш так и недошло
Спасибо dm9 =)

Автор: dm9 9.2.2004, 17:18
Построчно:


Сначала надо выделить строку, в которой будет производиться поиск. Для этого воспользуемся функцией Copy (S:String; I:Integer; N:Integer) : String;

Эта ф-ция возвращает подстроку строки S начиная с I-го символа длиной N.
Пример:
S := 'asdfghjkl';
S := Copy (S,2,6); //Вернёт 'sdfghj';

После этого ищем нужную подстроку ф-цией Pos.



  X := Pos (FindDialog1.FindText, {Строка, которая ищется}
            Copy (Richedit1.Text, {Весь текст в RichEdit}
                  Richedit1.SelStart + 1 + Richedit1.SelLength, {Индекс, равен позиции начала выделения плюс длина выделения (плюс один, так как первая позиция курсора - ноль), таким образом, мы ищем конец выделения}
                  Length(Richedit1.Text) - Richedit1.SelStart - Richedit1.SelLength)); {А это длина текста от конца выделения до конца текста}

  if X <> 0 //Если строка найдена
  then
  begin
     RichEdit1.HideSelection := false; {Разрешить выделение, это можно сделать один раз при старте приложения}
     RichEdit1.SelStart := X + Richedit1.SelStart + Richedit1.SelLength - 1; {Начало выделения}
     RichEdit1.SelLength := Length (Finddialog1.FindText); {Его длина}
  end
  else
     MessageDlg('Строка ' + FindDialog1.FindText + ' не найдена!', mtConfirmation, [mbyes], 0); {Если строка не найдена, сообщить об этом}
end;

Повторю, это поиск вниз. Для того, чтобы работал поиск вверх, и работали всякие опции типа "с учётом регистра", это надо обрабатывать самостоятельно. Все параметры поиска можно узнать из FindDialog1.Options

Например,
if frDown in FindDialog1.Options
then ... //Поиск вниз
else ... //Поиск вверх;

На другие параметры поиска (кроме frDown) можно посмотреть в Object Inspector-е.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)