![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с поиском. [D7, XP]
AlexanderMS © (2006-05-08 16:22:00)Помогите, пожалуйста, найти ошибку в коде, реализующего последовательный поиск по 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 20:10:00) [1]И снова провал... [5]. У кого-нибудь было такое?
AlexanderMS (2006-05-08 19:56:00) [2]После очередного тестирования я хотел бы переписать сообщение [4].
AlexanderMS (2006-05-08 19:54:00) [3]
> Это "пятничная задачка" на сообразительность, или же реальный
> > вопрос?
Теперь - вопрос. Откуда такой глюк?
AlexanderMS (2006-05-08 19:52:00) [4]О нет! Это уже слишком! Ничего не изменял, и снова глючит ! (Даже из Delphi не выходил). :( Искал один и тот же фрагмент!
TRichEdit.FindText
Чтоб этот метод упразднили! То возвращает -1, то нужное число. :-o
AlexanderMS (2006-05-08 19:33:00) [5]Вот чудо! Теперь всё OK! Что глючило, не ясно. Ничего не менял.
AlexanderMS (2006-05-08 19:05:00) [6]
> Это "пятничная задачка" на сообразительность, или же реальный
> вопрос? Если второе, то где, что и как?
Да, вопросом это не назвать.
> Помогите, пожалуйста, найти ошибку в коде, реализующего
> последовательный поиск по 2-м RichEdit'ам.
Скорее, задачка. Что делать? Сколько ни бьюсь, в первый раз ищет нормально, но затем начинает искать и не находит, выдаёт, что элемент не найден.
Virgo_Style (2006-05-08 17:08:00) [7]
> Помогите, пожалуйста, найти ошибку в коде
Это "пятничная задачка" на сообразительность, или же реальный вопрос? Если второе, то где, что и как?
AlexanderMS (2006-05-08 16:27:00) [8]Добавлю, что CSF - массив элементов (record: Name и Value, которые отображаются в соответствующих RichEdit'ах). Findline - индекс ListBox и массива, содержащего элементы (где искать).