Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1098072922
md5 hash
2004-10-18 08:15
2004.10.31
Объекты в StringGrid


3-1096560118
-=Krocki=-
2004-09-30 20:01
2004.10.31
Как хранить данные?


1-1097598677
Chieftain
2004-10-12 20:31
2004.10.31
Переменные


14-1097667095
Odessos
2004-10-13 15:31
2004.10.31
ВВ в Одессе


3-1096291401
UnDISCOvery
2004-09-27 17:23
2004.10.31
Как определить наличие записи в табл. Access?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский