![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехват исключения при создании формы. [D6, XP]
Drowsy © (2011-06-26 05:11:00)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)Как правильно обрабатывать такие ошибки?
Игорь Шевченко (2011-06-30 12:22:00) [1]
> procedure TfMain.HandleException(Sender: TObject; E: Exception);
>
> var
> EE: EDBEngineError;
> begin
> if E is EDBEngineError then
> begin
> ShowError(EE);
> end;
> end;
Удивительное рядом
petvv (2011-06-30 11:57:00) [2]Тебя уже посылали в мою ветку. Ну всё же отвечу, что у себя сделал так:
Есть главная форма при её создании объявляю:
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;
Drowsy (2011-06-26 12:39:00) [3]Спасибо, Леонид!
Leonid Troyanovsky (2011-06-26 10:08:00) [4]
> Drowsy © (26.06.11 05:11)
http://delphimaster.ru/cgi-bin/forum.pl?id=1308799300&n=18
--
Regards, LVT.