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

Вниз

Перехват исключения при создании формы.   Найти похожие ветки 

 
Drowsy ©   (2011-06-26 05:11) [0]

type
 TfmTest = class(TForm)
  procedure FormCreate(Sender: TObject);
end;
var fmTest : TfmTest;

implementation
procedure TfmCrush.FormCreate(Sender: TObject);
begin
  try  
....
==>>здесь Exception
...
 except
   ....
   Raise;
 end;
end;
-------
procedure MainForm.TestCreateOnClick(Sender : TObject)
begin
   inherited;

  try
    if not Assigned fmTest then
    begin
       try
          fmTest := TfmTest .Create(Application);
       except
==> сюда Except не приходит, а сразу в Application.OnException
           fmTest .Release;
           fmTest  := nil;
       end;
    end;
==> после Application.OnException продолжает выполняться.  
    with fmTest  do
    begin
        ShowModal;

        Release;
        fmTest  := nil;
    end;
 
 except
==> сюда не Except тоже, конечно, не приходит,
   if Assigned (fmTest  ) then
     begin
         Release;
         fmTest := nil;
     end;
 end;

end;

1)Получается, что если ошибка возникла в OnCreate формы, то форма (указатель на неё) уже создана и прехватить ошибку в блоке try create except end "напрямую" нельзя?!
2)Если в Application.OnException Написать Raise E; , то вызывается деструктор формы и надо так?
      try
          fmTest := TfmTest .Create(Application);
       except
==>  в Application.OnException, где Raise E
          if Assigned(   fmTest ) then  
           begin
              fmTest .Release;
              fmTest  := nil;
           end;
      end;
     
      if Assigned(   fmTest ) then
.....
3)Как правильно обрабатывать такие ошибки?


 
Leonid Troyanovsky ©   (2011-06-26 10:08) [1]


> Drowsy ©   (26.06.11 05:11)

http://delphimaster.net/view/2-1308799300/

--
Regards, LVT.


 
Drowsy ©   (2011-06-26 12:39) [2]

Спасибо, Леонид!


 
petvv   (2011-06-30 11:57) [3]

Тебя уже посылали в мою ветку. Ну всё же отвечу, что у себя сделал так:

Есть главная форма при её создании объявляю:

Application.onException:=HandleException;
...

procedure TfMain.HandleException(Sender: TObject; E: Exception);
var
 EE: EDBEngineError;
begin
 if E is EDBEngineError then
   begin
     ShowError(EE);
   end;
end;

procedure TfMain.ShowError(AExc: EDBEngineError);
begin
 GetErrText(AExc.Errors[AExc.ErrorCount-1].ErrorCode);
 MessageDlg(GetErrText(AExc.Errors[AExc.ErrorCount-1].ErrorCode)+#13#10+
 AExc.Errors[AExc.ErrorCount-1].Message,mtWarning, [mbOK], 0);
end;


На главной форме есть меню из которого запускаются другие формы
При нажатии на меню выполняется следующий код

procedure TfMain.ShowATPClick(Sender: TObject);
begin
 //Выводим форму для просмотра
edKard:=False;
 with TfseATP.Create(Application) do
 try
   //  до появления
   ShowModal;
   //  после закрытия
 finally
   Free;
 end;{try}
end;


А в вызываемой форме в моём случае fseATP нужно всего лишь переопределить функцию HandleCreateException

Само определение  

private
   { Private declarations }
   function HandleCreateException: Boolean; override;


и сама реализация
function TfseATP.HandleCreateException: Boolean;
begin
  Result := False;
end;


 
Игорь Шевченко ©   (2011-06-30 12:22) [4]


> procedure TfMain.HandleException(Sender: TObject; E: Exception);
>
> var
>  EE: EDBEngineError;
> begin
>  if E is EDBEngineError then
>    begin
>      ShowError(EE);
>    end;
> end;


Удивительное рядом



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

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

Наверх




Память: 0.48 MB
Время: 0.006 c
15-1308901353
Фокс Йовович
2011-06-24 11:42
2011.10.16
А существует ли такой плеер?


2-1309273647
Pcrepair
2011-06-28 19:07
2011.10.16
Использ. ZLIB для сжатия файла при передаче сервер-клиент


2-1309024072
eXAAAXe
2011-06-25 21:47
2011.10.16
Максимальное разрешение экрана.


8-1205914978
Franzy
2008-03-19 11:22
2011.10.16
OpenGL - как сделать "скриншот"?


2-1309017333
Lithium
2011-06-25 19:55
2011.10.16
Консоль