Форум: "KOL";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
ВнизКак искать заменять текст? При помощи FindReplaceDLG help! Найти похожие ветки
← →
4kusNick (2004-04-02 22:50) [0]Кто - нить знает, ка найти или заменить текст в RichEdit при помощи FindReplaceDialog?
← →
Delphi5.01 © (2004-04-03 21:49) [1]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!
← →
Delphi5.01 © (2004-04-04 20:17) [2]Здравствуйте!
При обычном поиске некого слова 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;
В результате получается сумма, которая смешается.
Желаю удачи
Прямо статья получилась :-))
← →
Gandalf © (2004-04-07 14:18) [3]FindReplaceDialog - ничего не ищет, он обесчивает лишь только стандартный диалог...
← →
4kusNick © (2004-04-11 21:28) [4]Спасибо! Получилось!
← →
Delphi5.01 © (2004-04-11 21:34) [5]Приятно слышать! :-)
← →
Dimaxx © (2004-04-13 22:26) [6]Гэндальф! В компоненте нет реакции на нажатие кнопки Поиск (должно быть событие OnFind, которое есть в стандартном VCL-компоненте).
← →
Delphi5.01 © (2004-04-14 08:29) [7]Kak vsegda :-)
← →
Gandalf © (2004-04-14 14:27) [8]2Dimaxx - ок спасибо, поправил... там вообще привзяки к событиям не было... теперь есть.
← →
4kusNick © (2004-04-17 19:20) [9]Спасибо всем за советы. Я решил создать свою форму, на которой разместил необходимые поля поиска\замены, ну в общем сделал некое подобие стандартного диалога FindReplace и описал обработку событий нажатия кнопок "Найти", "Найти далее". Работает.
← →
4kusNick © (2004-04-17 19:20) [10]Спасибо всем за советы. Я решил создать свою форму, на которой разместил необходимые поля поиска\замены, ну в общем сделал некое подобие стандартного диалога FindReplace и описал обработку событий нажатия кнопок "Найти", "Найти далее". Работает.
← →
4kusNick © (2004-04-17 19:20) [11]Спасибо всем за советы. Я решил создать свою форму, на которой разместил необходимые поля поиска\замены, ну в общем сделал некое подобие стандартного диалога FindReplace и описал обработку событий нажатия кнопок "Найти", "Найти далее". Работает.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c