Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка ошибок в открывающейся форме [D7, XP]


Страницы:   1 2 3 4

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;


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо