![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка ошибок в открывающейся форме [D7, XP]
Laguna © (2011-10-05 10:28:00)Из главной формы открывается другая, в которой открываются таблицы. Во время открытия могут возникнуть ошибки(отсутствует файл, отсутствует индекс и т.д). Как правильно не допустить конечное открытие формы, если на этапе onCreate возникли ошибки. Из главной формы вход оформлен вот так :
Screen.Cursor := crHourGlass;
M_Frm := TM_Frm.Create(Application);
M_Frm.Lab1.Caption := 'Выполняется подготовка, ожидайте...';
M_Frm.Show;
M_Frm.Update;
S_Frm := TS_Frm.Create(Application);
S_Frm.ShowModal;
M_Frm.Hide;
M_Frm.Free;
Screen.Cursor := crDefault;
S_Frm.CLose;
S_Frm.Free;
procedure TS_Frm.FormCreate(Sender: TObject);
Var
ErrorString : String;
begin
try
DM1.T1Tbl.Open;
DM1.T2Tbl.Open;
DM1.T3Tbl.Open;
DM1.T4Tbl.Open;
DM1.T5Tbl.Open;
except
on E: EDatabaseError do
application.messagebox( pchar(E.message), 'Native Database Error', 0 );
end;
end;
_Юрий (2011-10-05 12:31:00) [61]
> Что-то я не понял. Приведи пример.
type
TS_Frm = class(TForm)
public
constructor Create(AOwner: TComponent); override;
end;
constructor TS_Frm.Create(AOwner: TComponent);
begin
inherited;
А тут код открытия таблиц и прочее
end;
При возникновении исключения форма автоматически разрушится, и на экране ничего показано не будет.
В отличие от OnCreate, которое вызывается не из тела конструктора, а из AfterConstruction
Ega23 (2011-10-05 12:09:00) [62]
> Есть главная форма. В ней создается модальная форма S_Frm
> , в которой в свою очередь открываются таблицы.... Ну опять
> [1] переписывать?
Тогда ответ уже дан.
Laguna (2011-10-05 12:06:00) [63]
> Если честно, то:1. Код вообще непонятен. Что такое TM_Frm
> и TS_Frm - тебе может быть и понятно, но другим нет.2. Непонятна
> вообще вся архитектура приложения.3. Непонятна суть вопроса.
S_Frm и M_Frm названия двух форм. В [1] разве не видно как они создаются?
M_Frm := TM_Frm.Create(Application);
S_Frm := TS_Frm.Create(Application);
> Я вопрос понял так: есть некая модальная форма. При её создании
> делается много вещей, где может возникнуть исключение, как
> это лучше обработать?
В принципе так. Есть главная форма. В ней создается модальная форма S_Frm, в которой в свою очередь открываются таблицы.... Ну опять [1] переписывать?
Ega23 (2011-10-05 11:56:00) [64]
> Если выполнить потенциально опасный код не в OnCreate, а
> непосредственно в переопределенном конструкторе
Что-то я не понял. Приведи пример.
_Юрий (2011-10-05 11:51:00) [65]Проще поступить не так.
Если выполнить потенциально опасный код не в OnCreate, а непосредственно в переопределенном конструкторе, желаемое поведение получится автоматически
Anatoly Podgoretsky (2011-10-05 11:50:00) [66]
> M_Frm := TM_Frm.Create(Application);
на вопрос отвечает этот код, как уже указали некоторые
M_Frm := TM_Frm.Create(Application);
try
Ega23 (2011-10-05 11:36:00) [67]
> Дело в том, что из [1] видно , что из главной формы у меня
> так же запускается информационное окно (M_Frm := TM_Frm.
> Create(Application);)
Если честно, то:
1. Код вообще непонятен. Что такое TM_Frm и TS_Frm - тебе может быть и понятно, но другим нет.
2. Непонятна вообще вся архитектура приложения.
3. Непонятна суть вопроса.
Я вопрос понял так: есть некая модальная форма. При её создании делается много вещей, где может возникнуть исключение, как это лучше обработать?
Laguna (2011-10-05 11:30:00) [68]Дело в том, что из [1] видно , что из главной формы у меня так же запускается информационное окно (M_Frm := TM_Frm.Create(Application);) Для него же тоже нужно отлавливать закрытие и высвобождение памяти если произошла ошибка. А этот код я так понял выполняется во второй форме
with TSomeForm.Create(Application) do
try
try
InitSomeForm; <-- Вот в этом методе и реализуешь всю загрузку из БД или чё там...
ShowModal;
except on E: Exception do
ShowMessage('Epic Fail!' + sLineBreak + E.Message);
end;
finally
Free;
end;
Ega23 (2011-10-05 11:13:00) [69]
> как не допустить загрузки формы в случае ошибки.
Я уже ответил. Вынеси весь код из TSomeForm.OnCreate в TSomeForm.InitSomeForm;
Laguna (2011-10-05 11:05:00) [70]Брр.. не совсем понял зачем дополнительный метод? Что это даст? TsomeForm в данном случае , применительно к моему вопросу какая форма выступает? Здесь главное не так ошибку описать, как не допустить загрузки формы в случае ошибки.
Ega23 (2011-10-05 10:59:00) [71]
> все очистится автоматически.
вызовется destructor
И. Павел (2011-10-05 10:56:00) [72]> [2] Laguna © (05.10.11 10:46)
free делать не нужно. При возникновении исключения в конструкторе, все очистится автоматически.
Ega23 (2011-10-05 10:55:00) [73]Забыл:
with TSomeForm.Create(Application) do
try
try
InitSomeForm; <-- Вот в этом методе и реализуешь всю загрузку из БД или чё там...
ShowModal;
except on E: Exception do
ShowMessage('Epic Fail!' + sLineBreak + E.Message);
end;
finally
Free;
end;
Ega23 (2011-10-05 10:55:00) [74]Делай это не на OnCreate, а заведи отдельный public-метод. Его и дёргай:
with TSomeForm.Create(Application) do
try
try
InitSomeForm; <-- Вот в этом методе и реализуешь всю загрузку из БД или чё там...
except on E: Exception do
ShowMessage('Epic Fail!' + sLineBreak + E.Message);
end;
finally
Free;
end;
Laguna (2011-10-05 10:46:00) [75]Этот вариант я просматривал. Уточнюсь дополнительно. Если произошла ошибка в момент создания формы в блоке try, то успела ли выделися для нее память и нужно ли в Except добавить S_Frm.Free ?
И. Павел (2011-10-05 10:36:00) [76]Можно перехватывать ошибки не в FormCreate а в вызывающей функции, т.е.:
try
M_Frm := TM_Frm.Create(Application);
except
...
Exit;
end;
S_Frm.ShowModal;