![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как искать\заменять текст? При помощи FindReplaceDLG help! [Delphi, Windows]
4kusNick © (2004-04-02 22:50:00)Кто - нить знает, ка найти или заменить текст в RichEdit при помощи FindReplaceDialog?
4kusNick (2004-04-17 19:20:00) [1]Спасибо всем за советы. Я решил создать свою форму, на которой разместил необходимые поля поиска\замены, ну в общем сделал некое подобие стандартного диалога FindReplace и описал обработку событий нажатия кнопок "Найти", "Найти далее". Работает.
4kusNick (2004-04-17 19:20:00) [2]Спасибо всем за советы. Я решил создать свою форму, на которой разместил необходимые поля поиска\замены, ну в общем сделал некое подобие стандартного диалога FindReplace и описал обработку событий нажатия кнопок "Найти", "Найти далее". Работает.
4kusNick (2004-04-17 19:20:00) [3]Спасибо всем за советы. Я решил создать свою форму, на которой разместил необходимые поля поиска\замены, ну в общем сделал некое подобие стандартного диалога FindReplace и описал обработку событий нажатия кнопок "Найти", "Найти далее". Работает.
Gandalf (2004-04-14 14:27:00) [4]2Dimaxx - ок спасибо, поправил... там вообще привзяки к событиям не было... теперь есть.
Delphi5.01 (2004-04-14 08:29:00) [5]Kak vsegda :-)
Dimaxx (2004-04-13 22:26:00) [6]Гэндальф! В компоненте нет реакции на нажатие кнопки Поиск (должно быть событие OnFind, которое есть в стандартном VCL-компоненте).
Delphi5.01 (2004-04-11 21:34:00) [7]Приятно слышать! :-)
4kusNick (2004-04-11 21:28:00) [8]Спасибо! Получилось!
Gandalf (2004-04-07 14:18:00) [9]FindReplaceDialog - ничего не ищет, он обесчивает лишь только стандартный диалог...
Delphi5.01 (2004-04-04 20:17:00) [10]Здравствуйте!
При обычном поиске некого слова Word вы проверяете строку, или методом Pos или вручную каждый символ. В случае Pos, скорость маленькая если в тексте не раз встречается Word, так как Pos всегда ищет с начала текста. Что касается ручного поиска то он осуществляется
function FindWord(...): Integer;
...
begin
...
for i:=1 to Length(Text) do
if Word[1]=Text[i] then
begin
IsSuitable:=True;
for j:=2 to Length(Word) do
if Word[j]<>Text[i+j-1] then
IsSuitable:=False;
If Suitable then
begin
Result:=i;
end;
end;
...
end;
но данный метод не дал хорошего результата, так как часто бывает что совпадает несколько начальных символов искомого Word слова. А в этой ситуации происходит лишним сравнения. Как раз для таких ситуаций я на туре использую отрывок из метода ХЕША, он заключается в следующем.
Word = "ABAC" искомое слово;
Text = где ищем слово Word;
Для начала вычисляем сумму кодов символов искомого слова. Например если мы ищем слово "ABAC" то сумма будет равна 65+66+65+67 (если не ошибаюсь в ASCII кодах символов, их легко получить функцией Ord('A')). Результат сохраняем в некую переменную WordSum.
Для нашего искомого слова "ABAC", длинна будет равна 4. Таким же образом, каким мы получили суму кодов символов искомого слова, вычисляем сумму кодов первых 4 символов Text.
Результат сохраняем в другой переменной TextSum. Послу чего организуем циклический поиск, только вместо того чтобы сравнивать первый символ искомого слова с Text[i] элементам, сравниваем суммы. Заметим что после первого сравнения TextSum надо добавить код следующего символа Length(Word)+1 и отнять код первого символа. Всего две операции, но они гарантируют большой полезный коэффициент, так как если суммы равны в 80% случаях и сами символы равны. На практике это будет выглядеть так:
WordSum:=0;
TextSum:=0;
for i:=1 to Length(Word) do
begin
Inc(WordSum,Ord(Word[i]));
Inc(TextSum,Ord(Text[i]));
end;
for i:=1 to Length(Text) do
begin
if WordSum=TextSum then
begin
IsSuitable:=True;
for j:=1 to Length(Word) do
if Word[j]<>Text[i+j-1] then
IsSuitable:=False;
If Suitable then
begin
Result:=i;
exit;
end;
end;
Inc(TextSum,Word[i+Length(Word)]); //dobavlau novi simvol
Dec(TextSum,Word[i]); //otnimau pervi simvol
end;
В результате получается сумма, которая смешается.
Желаю удачи
Прямо статья получилась :-))
Delphi5.01 (2004-04-03 21:49:00) [11]Ia znau metod poiska "XESHA", esli hochesh mogu nauchit, skorost ochen bolshaia, danni algoritm ispolcuetsa na olimpiadah po programirovaniu. chem bolshe fragment nado iskat tem skorost bolshe (bolshe 3 simvolov, v protivnom sluchae vigodi netu). v sredenm viigrish inogda dohodit do 70 raz bistrei!