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

Вниз

Странное поведение FindDialog   Найти похожие ветки 

 
Darvin   (2009-05-27 17:53) [0]

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


 
{RASkov} ©   (2009-05-27 17:56) [1]

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


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

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


 
KilkennyCat ©   (2009-05-27 18:21) [3]

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


 
{RASkov} ©   (2009-05-27 19:41) [4]

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

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


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


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

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


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

Вызов диалога:
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;


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


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

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

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

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


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

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


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


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


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


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

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


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


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

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


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

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


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

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


 
Anatoly Podgoretsky ©   (2009-05-28 16:55) [14]

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

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



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

Текущий архив: 2009.07.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
2-1243850262
Максим
2009-06-01 13:57
2009.07.26
TMenuItem


15-1242854996
Германн
2009-05-21 01:29
2009.07.26
Поздравляю Шахтёр!


15-1243406709
Кто б сомневался
2009-05-27 10:45
2009.07.26
Защита ПО на основе серийника железа, и другой комьпютер


2-1243843842
девушка
2009-06-01 12:10
2009.07.26
cxGrid как SelectedRecordCount на нижнем уровне


15-1243413974
b/@.
2009-05-27 12:46
2009.07.26
Как нарисовать в иконке оранжевый ?