Главная страница
    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.01 c
1-1145630809
Sam Stone
2006-04-21 18:46
2006.05.28
Задача оптимального раскроя


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


15-1146749987
grisme
2006-05-04 17:39
2006.05.28
Непрерывный сигнал из порта


2-1147203397
КИРПИЧ
2006-05-09 23:36
2006.05.28
ПОМОГИТЕ ПОЖАЛСТА


2-1147423268
Megabyte
2006-05-12 12:41
2006.05.28
создание простейшего сервиса





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