Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Вниз

Проблема с поиском.   Найти похожие ветки 

 
AlexanderMS ©   (2006-05-08 16:22) [0]

Помогите, пожалуйста, найти ошибку в коде, реализующего последовательный поиск по 2-м RichEdit"ам.
На главной форме - ListBox и справа - 2 RichEdit, соответственно Name и Value.
Мой FindDialog - нечто похожее на окно поиска в Word"е: 3 страницы: Найти, Заменить, Перейти.

procedure TFindDialog.BFindClick(Sender: TObject);
const
 tofind = 0;
 torep  = 1;
 togoto = 2;
var
 choice : byte;
 tobreak : boolean;
 searchtype : TSearchTypes;

begin

tobreak := false;
choice := tabcontrol.TabIndex;

case choice of
 tofind, torep :  {Найти или заменить}
 begin
   if      Rall.Checked       then placetofind := 6
   else if RNameOnly.Checked  then placetofind := 2
   else if RValueOnly.Checked then placetofind := 3;
   findline := Window.List.ItemIndex;
   SearchType := [];
   if RCaseSens.Checked then include(searchtype, stmatchcase);
   if RWholeWord.Checked then include(searchtype, stwholeword);
   repeat
     if placetofind mod 2 = 0 then with Window.Name do
       begin

         if SelLength <> 0
           then
             StartPos := SelStart + SelLength
           else
             StartPos := 0;

         ToEnd := Length(Text) - StartPos;

         FoundAt := FindText(FindDialog.CBFind.Text, StartPos, ToEnd, searchtype);

         if FoundAt <> -1
           then
             begin
               SetFocus;
               SelStart := FoundAt;
               SelLength := Length(FindDialog.CBFind.Text);
               FindDialog.SetFocus;
               exit
             end
           else
             if placetofind = 2
               then
                 repeat
                   inc(findline);

                   if findline = Window.List.Items.Count
                     then
                       begin
                         showmessage("Искомый элемент не найден");
                         tobreak := true;
                         break
                       end;

                   if pos(FindDialog.CBFind.Text, Window.CSF[SendMessage(Window.List.Handle, LB_GetItemData, findline, 0)].name) <> 0
                     then
                       begin
                         Window.List.ClearSelection;
                         Window.List.Selected[findline] := true;
                         Window.ListClick(Window);
                         break
                       end;

                 until false;

   if tobreak then break;
   with window.Value do
     begin
       if SelLength <> 0
         then
           StartPos := SelStart + SelLength
         else
           StartPos := 0;

       ToEnd := Length(Text) - StartPos;

       FoundAt := FindText(FindDialog.CBFind.Text, StartPos, ToEnd, searchtype);

       if FoundAt <> -1
         then
           begin
             SetFocus;
             SelStart := FoundAt;
             SelLength := Length(FindDialog.CBFind.Text);
             exit
           end
         else
           repeat
             inc(findline);
             if findline = Window.List.Items.Count
               then
                 begin
                   showmessage("Искомый элемент не найден");
                   tobreak := true;
                   break
                 end;
             if placetofind <> 3
               then
                 if pos(FindDialog.CBFind.Text, Window.CSF[SendMessage(Window.List.Handle, LB_GetItemData, findline, 0)].name) <> 0
                   then
                     begin
                       Window.List.ClearSelection;
                       Window.List.Selected[findline] := true;
                       Window.ListClick(Window);
                       break
                     end;

             if pos(FindDialog.CBFind.Text, Window.CSF[SendMessage(Window.List.Handle, LB_GetItemData, findline, 0)].value) <> 0
               then
                 begin
                   Window.List.ClearSelection;
                   Window.List.Selected[findline] := true;
                   Window.ListClick(Window);
                   break
                 end;

           until false
   end
 end

until findline = Window.List.Items.Count
end;

 togoto :
----------------------------
и т.д. - не важно.


 
AlexanderMS ©   (2006-05-08 16:27) [1]

Добавлю, что CSF - массив элементов (record: Name и Value, которые отображаются в соответствующих RichEdit"ах). Findline - индекс ListBox и массива, содержащего элементы (где искать).


 
Virgo_Style ©   (2006-05-08 17:08) [2]


> Помогите, пожалуйста, найти ошибку в коде


Это "пятничная задачка" на сообразительность, или же реальный вопрос? Если второе, то где, что и как?


 
AlexanderMS ©   (2006-05-08 19:05) [3]


> Это "пятничная задачка" на сообразительность, или же реальный
> вопрос? Если второе, то где, что и как?

Да, вопросом это не назвать.


> Помогите, пожалуйста, найти ошибку в коде, реализующего
> последовательный поиск по 2-м RichEdit"ам.


Скорее, задачка. Что делать? Сколько ни бьюсь, в первый раз ищет нормально, но затем начинает искать и не находит, выдаёт, что элемент не найден.


 
AlexanderMS ©   (2006-05-08 19:33) [4]

Вот чудо! Теперь всё OK! Что глючило, не ясно. Ничего не менял.


 
AlexanderMS ©   (2006-05-08 19:52) [5]

О нет! Это уже слишком! Ничего не изменял, и снова глючит! (Даже из Delphi не выходил). :( Искал один и тот же фрагмент!
TRichEdit.FindText
Чтоб этот метод упразднили! То возвращает -1, то нужное число. :-o


 
AlexanderMS ©   (2006-05-08 19:54) [6]


>  Это "пятничная задачка" на сообразительность, или же реальный
> >  вопрос?

Теперь - вопрос. Откуда такой глюк?


 
AlexanderMS ©   (2006-05-08 19:56) [7]

После очередного тестирования я хотел бы переписать сообщение [4].


 
AlexanderMS ©   (2006-05-08 20:10) [8]

И снова провал... [5]. У кого-нибудь было такое?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.018 c
2-1147241309
СержК
2006-05-10 10:08
2006.05.28
Кодировка в RxRichEdit


1-1145450930
Alex_C
2006-04-19 16:48
2006.05.28
Почему прерывается выполнение Thread?


15-1146430993
iZEN
2006-05-01 01:03
2006.05.28
С днём весны и труда.


2-1147461468
Viconia
2006-05-12 23:17
2006.05.28
Посмотрите, плиз, запрос...


4-1141197430
Yaral
2006-03-01 10:17
2006.05.28
Виртуальный Com порт





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский