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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.041 c
4-1141399908
Handle
2006-03-03 18:31
2006.05.28
Как завершить системныЙ процесс?


2-1147451903
Vitalik__
2006-05-12 20:38
2006.05.28
Ищу компонент делфи


4-1141194528
antonn
2006-03-01 09:28
2006.05.28
Блокировать сворачивание окна


6-1138722804
Aleksei
2006-01-31 18:53
2006.05.28
Интернет


15-1146726042
mfender
2006-05-04 11:00
2006.05.28
Форматирование кода в IDE