Форум: "Начинающим";
Текущий архив: 2011.10.16;
Скачать: [xml.tar.bz2];
ВнизПерехват исключения при создании формы. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c