Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странное поведение FindDialog [D5, XP]


Darvin ©   (2009-05-27 17:53:00) 

Здравствуйте!
Выполняю с помощью FindDialog-а поиск по тексту в Memo. Иногда, далеко не всегда, возникает Access Violation при нажатии кнопки [Отмена] или клавиши Esc в нем. С чем это может быть связано? Я действий никаких на его закрытие не программировал. Может быть, я что-то туплю?


Anatoly Podgoretsky   (2009-05-28 16:55:00) [1]

> Darvin  (28.05.2009 12:20:08)  [8]

Отладчик он в голове


Darvin   (2009-05-28 13:49:00) [2]

>для начала пересобери  свой проект с Use Debug DCUs = True
Ок, спасибо, попробую


Сергей М.   (2009-05-28 12:53:00) [3]

для начала пересобери  свой проект с Use Debug DCUs = True


Плохиш   (2009-05-28 12:52:00) [4]


> Darvin   (28.05.09 12:20) [8]
>
> >Плохиш ©
> >Это ты нам одолжение сделаешь?
> Хамить не надо! Если бы мне удалось им воспользоваться,
> я бы на форум не ходил... Укажи мне, темному, функцию ХОРОШЕГО
> отладчика, которая решит эту проблему,

Точки останова, кнопки F7/F8.


Darvin   (2009-05-28 12:47:00) [5]

>Сергей М.
Вот и я не погимаю. При нажатии в режиме отладки возникает АВ и отладчик останавливается на этой строке


Сергей М.   (2009-05-28 12:33:00) [6]


> Access Violation при нажатии кнопки [Отмена] или клавиши
> Esc в нем


А причем здесь тогда Application.Run ?


Darvin   (2009-05-28 12:20:00) [7]

>Плохиш ©
>Это ты нам одолжение сделаешь?
Хамить не надо! Если бы мне удалось им воспользоваться, я бы на форум не ходил... Укажи мне, темному, функцию ХОРОШЕГО отладчика, которая решит эту проблему, если ты такой умный.
А если у тебя нет светлых мыслей, то и постить нечего...


Плохиш   (2009-05-28 11:56:00) [8]


> Darvin   (28.05.09 10:36) [5]
>
>

В делфи встроен хороший отладчик.

> Darvin   (27.05.09 17:59) [2]
>
> могу привести коды

Это ты нам одолжение сделаешь?


Darvin   (2009-05-28 10:43:00) [9]

Вызов диалога:
procedure TfrmLogVisualPage.acSearchExecute(Sender: TObject);
begin
  FindDialog.Execute;
end;


Обработка поиска:
procedure TfrmLogVisualPage.FindDialogFind(Sender: TObject);
var
 I, PosReturn, SkipChars : Integer;
 IsFound                 : Boolean;

 function FindIterate ( Idx : Integer ) : Boolean;
 var
   I    : Integer;
 begin         // Найти в строке совпадение
   Result := true;
   if frMatchCase in FindDialog.Options then  // С учетом регистра
     PosReturn := Pos ( FindDialog.FindText, meRecParams.Lines[Idx] )
   else                                       // Без учета регистра
     PosReturn := Pos ( AnsiUpperCase(FindDialog.FindText), AnsiUpperCase(meRecParams.Lines[Idx]) );

   // Если только слово целиком
   if frWholeWord in FindDialog.Options then begin
     if ( PosReturn > 1 ) and ( meRecParams.Lines[Idx][PosReturn - 1] <> ' ' ) then
       PosReturn := 0;
     if ( PosReturn < Length(meRecParams.Lines[Idx]) ) and
        ( meRecParams.Lines[Idx][PosReturn + Length(FindDialog.FindText) + 1] <> ' ' ) then
       PosReturn := 0;
   end;

   // Нашли?
   if PosReturn <> 0 then
   begin
     // Подсчет кол-ва Enter-ов
     Skipchars := 0;
     for I := 0 to Idx - 1 do
       Skipchars := Skipchars + Length(meRecParams.Lines[I]);
     SkipChars := SkipChars + (Idx*2);
     // Общее смещение по коду
     SkipChars := SkipChars + PosReturn - 1;

     // Выделить найденный текст
     meRecParams.SetFocus;
     meRecParams.SelStart := SkipChars;
     meRecParams.SelLength := Length ( FindDialog.FindText );
     FSearchStartLn := Idx + 1;   // С этой строки начнем поиск при следующей попытке
     IsFound := true;
     meRecParams.BringToFront;

     Result := false;
   end
 end;  // of FindIterate
 //--------------------------------------------------------------

begin
 IsFound := false;
 // Пройти по строкам Memo от последней найденной до следующей или до конца
 if frDown in FindDialog.Options then  // Вниз по тексту
 begin
   for I := FSearchStartLn to meRecParams.Lines.Count - 1 do
     if not FindIterate(I) then Break
 end
 else begin                            // Вверх по тексту
   for I := FSearchStartLn - 2 downto 0 do
     if not FindIterate(I) then Break;
 end;

 // Текст не найден - обнулить поиск
 if not IsFound then begin
   ssMessageInfo ( 0, MSG_TextNotFound_s, [FindDialog.FindText] );
   FSearchStartLn := 0;
 end;
end;


Darvin   (2009-05-28 10:36:00) [10]


> приводи.... приведи строку где ав...

Вываливается на Application.Run  (((


{RASkov}   (2009-05-27 19:41:00) [11]

> [2] Darvin   (27.05.09 17:59)
> могу привести коды

приводи.... приведи строку где ав...


KilkennyCat   (2009-05-27 18:21:00) [12]

тестировать на другой машине.


Darvin   (2009-05-27 17:59:00) [13]

могу привести коды вызова FindDialog и обработки FindDialogFind. Но они тут не вызываются


{RASkov}   (2009-05-27 17:56:00) [14]

мало инфы для реальной помощи, а так: У тебя обращение к "битой" памяти...


Наверх

Титульная страница Поиск, карта сайта Написать письмо