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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск 
:(
    Опции темы
Victor
  Дата 8.2.2004, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Люди как быть
Код

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)А как ещё заменить на текст который я ввел в поиске
?

PM MAIL   Вверх
dm9
Дата 9.2.2004, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



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.
PM MAIL ICQ   Вверх
December
Дата 9.2.2004, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


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

Репутация: 8
Всего: 57



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



--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Victor
Дата 9.2.2004, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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
PM MAIL   Вверх
dm9
Дата 9.2.2004, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Ф-ция 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

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

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

Это сообщение отредактировал(а) dm9 - 9.2.2004, 14:43
PM MAIL ICQ   Вверх
Paradox
Дата 9.2.2004, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 1



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

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


--------------------
---
PM MAIL WWW   Вверх
dm9
Дата 9.2.2004, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Сорри, я в примерах лажу написал. Торопился очень. Всё исправил.
PM MAIL ICQ   Вверх
Victor
Дата 9.2.2004, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А про 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 =)
PM MAIL   Вверх
dm9
Дата 9.2.2004, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Построчно:


Сначала надо выделить строку, в которой будет производиться поиск. Для этого воспользуемся функцией 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-е.

Это сообщение отредактировал(а) dm9 - 9.2.2004, 17:20
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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