Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

Как искать заменять текст? При помощи 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 вся ветка

Текущий архив: 2004.10.31;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
1-1097758143
HanIP
2004-10-14 16:49
2004.10.31
удалить строку Excel


1-1097739709
AlexanderSK
2004-10-14 11:41
2004.10.31
Есть ли в дельфи константа для обозначения конца строки?


3-1096909767
}|{yk
2004-10-04 21:09
2004.10.31
При отправлении Cancel - получается ... Insert


14-1097599012
Шишкин Илья
2004-10-12 20:36
2004.10.31
Псевдо вирус


3-1096537176
Pilot
2004-09-30 13:39
2004.10.31
Разработка сетевого ПО в Delphi