| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Поиск |
| Автор: Victor 8.2.2004, 17:05 | ||
Люди как быть
Поиск работает, но мне надо 1)Чтобы если я несколько раз попрошу найти тот или иной текст т.е я тыркаю кнопку Найти она только 1 раз работает 2)А как ещё заменить на текст который я ввел в поиске ? |
| Автор: dm9 9.2.2004, 01:43 | ||
| 1. "Не" с глаголами пишется раздельно. 2. Ответ на первый вопрос:
Работает поиск вниз начиная с позиции курсора. Поиск вверх делаешь аналогично, добавить только одно условие. 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 Но я непойму где ты сделал чтобы все время можно было искатать и где проверка кнопки вверх/вниз чтоли, если что-то менять то он будет искать только вверх или как ? |
| Автор: 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 | ||
Имелось ввиду что вернет 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-е. |