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-09 23:47:00) [1]

> Laguna
> Как правильно не допустить конечное открытие формы, если на этапе
> onCreate возникли ошибки.

1. Замещаете конструктор формы и в нем сначала пишете inherited, а потом - код инициализации формы (тот, что раньше был в OnCreate).

2. В этом коде при невозможности инициализации формы (нет доступа к БД, еще что угодно) возбуждаете исключение.

3. Теперь, когда Ваш код будет создавать эту форму, то она либо нормально создастся, либо возникнет исключение. В первом случае все ОК, показываем форму и работаем. Во втором же случае форма создана не будет (точнее, она будет создана, но тут же будет автоматически уничтожена кодом VCL, без всяких наших усилий) - а Вам остается только поймать это исключение и вывести юзеру внятное сообщение. Для этого достаточно вызов конструктора формы поместить в блок try-except:

procedure TAppMainForm.SomeButtonClick(Sender: TObject);
var
 MyForm: TMyForm;
begin
 try
   MyForm := TMyForm.Create(Application)
 except
   on e: Exception do
   begin
     MessageBox(...); // Здесь используем e.Message.
     Exit
   end
 end;
 // Здесь показываем форму и работаем с ней, а в конце, если она
 // уже не нужна, то убиваем ее (используя для этого try-finally).
end;


Laguna   (2011-10-09 22:45:00) [2]

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


Laguna   (2011-10-09 22:43:00) [3]


> Есть датамодуль. В нём всякие ImageList-ы, глобальный коннект
> к БД, несколько датасорс-датасет-ов и TDBConnectDialog.
> Отдельный компонент, невизуальный (в дизайн-тайм). Который,
>  собственно, отрабатывает при старте либо при реконнекте.
> Датамодуль создаётся первым. Если коннект не прошёл, то
> убивается и выход, до создания главной формы дело даже не
> дошло.Вот, собственно, и всё.


А чего вы все зациклились на показе главной формы? Вопрос был не в этом. В DM у меня лежат все компоненты, связанные с таблицами, имагесы  и т.д. Изначально все таблицы не открываю. Разные формы связаны с открытием разных таблиц по необходимости. Поэтому и проверяю перед открытием формы валидность доступа к данным. Смысл открывать форму с пустым гридом, если данные не открылись?


Ega23   (2011-10-09 22:03:00) [4]


> всегда получают главную форму с возможностью подключения


Какая разница?


Jeer   (2011-10-07 11:14:00) [5]


> В рамках компонента.
>

Даже как очень частный случай, рассматривают такой метод для себя нежелательным.
В моих случаях, пользователи всегда получают главную форму с возможностью подключения к тому или иному северу, той или иной БД.
Разумеется, физические детали скрыты от юзера, но он понимает, к чему хочет подключиться. Ну и получает мессаги и статус контролов на форме по результатам подключения.


Ega23   (2011-10-07 10:54:00) [6]


> А как же уведомление пользователя о том, что "Необходимо
> обратиться к администратору с целью проверки связи с сервером
> приложения"?


В рамках компонента.


Cobalt   (2011-10-07 10:49:00) [7]

Ega23 ©   (06.10.11 19:28) [68]
> Если коннект не прошёл, то убивается и выход, до создания
> главной формы дело даже не дошло.
> Вот, собственно, и всё.


А как же уведомление пользователя о том, что "Необходимо обратиться к администратору с целью проверки связи с сервером приложения"?


_Юрий   (2011-10-06 20:13:00) [8]


> И. Павел ©   (06.10.11 14:49) [53]
>



> Чувствую, не доводилось вам сталкиваться с истинным говнокодом
> :)


Ему доводилось, я гарантирую это. Не верите - смотрите [27], это ни что иное, как он самый  и есть.


Ega23   (2011-10-06 19:28:00) [9]


> Так и обходись одним датамодулем, зачем тебе все остальное?


Есть датамодуль. В нём всякие ImageList-ы, глобальный коннект к БД, несколько датасорс-датасет-ов и TDBConnectDialog. Отдельный компонент, невизуальный (в дизайн-тайм). Который, собственно, отрабатывает при старте либо при реконнекте.
Датамодуль создаётся первым. Если коннект не прошёл, то убивается и выход, до создания главной формы дело даже не дошло.
Вот, собственно, и всё.


Jeer   (2011-10-06 17:47:00) [10]


> MsGuns ©   (06.10.11 16:41) [63]
> Хотя это дело вкуса, конечно.


Для такого варианта - вкуса нет, в моем понимании.


Jeer   (2011-10-06 17:43:00) [11]


> Ega23 ©   (06.10.11 17:09) [64]
> > Но загромождать датамодули созданием формочек
> Знаешь, TOpenDialog тоже в каком-то смысле "формочка". Против
> него у тебя ничего нет?


Так и обходись одним датамодулем, зачем тебе все остальное ?


Игорь Шевченко   (2011-10-06 17:09:00) [12]


> Да уж, не часто в последнее время высовываюсь в Мастаках


Мудро, Штирлиц. Руководствуйтесь этим и впредь.


Ega23   (2011-10-06 17:09:00) [13]


> Но загромождать датамодули созданием формочек


Знаешь, TOpenDialog тоже в каком-то смысле "формочка". Против него у тебя ничего нет?


Ega23   (2011-10-06 16:41:00) [14]


> Нам ничего не надо делать.


в одном случае нам надо перекрыть AfterContruction и производить инициализацию там, в другом - добавить метод InitSomething и производить инициализацию в нём.
Разница в последующей эксплуатации - в одной строке.
Спор ниочём.


MsGuns   (2011-10-06 16:41:00) [15]

>Ega23 ©   (06.10.11 16:14) [60]
>Судя по твоей ремарке у меня складывается впечатление

Извини, но мне как то все равно что у тебя и где складывается.
Но загромождать датамодули созданием формочек и вообще чего-то визуального принципиально не желаю ибо для этого имеются вполне удобные компоненты, в т.ч. и формы. Либо библиотеки.
Хотя это дело вкуса, конечно.


Юрий Зотов   (2011-10-06 16:31:00) [16]

> Ega23 ©   (06.10.11 15:36) [58]
> Вопрос в преимуществе

Оно заключается в слове "автоматически". Нам ничего не надо делать.


Ega23   (2011-10-06 16:14:00) [17]


> Если действительно интересно (в чем очень сомневаюсь), то
> поищи на этом же форуме - валом, в т.ч. и с моими скромными
> репликами


Судя по твоей ремарке у меня складывается впечатление, что у тебя действительно отсутствует понимание в предназначении DataModule. Это не шутка и не ёрничание.


MsGuns   (2011-10-06 15:46:00) [18]

>Ega23 ©   (06.10.11 14:45) [52]
>И, кстати, я так и не услышал лекции, для чего предназначены >ДатаМодули. Очень интересно послушать.

Если действительно интересно (в чем очень сомневаюсь), то поищи на этом же форуме - валом, в т.ч. и с моими скромными репликами
Если просто пофлудить для удовлетворения своего эго, то без меня.

>Игорь Шевченко ©   (06.10.11 15:20) [55]
>Вот и не выходи

Да уж, не часто в последнее время высовываюсь в Мастаках, - просто не интересно. А тут решил "выйти" :)
Ну извини уж, что заставил тебя трудится да тратить твой сарказм


Ega23   (2011-10-06 15:36:00) [19]


> Тогда без меня...


Не, то что она будет автоматически уничтожена, спору нет. Вопрос в преимуществе. :)


Юрий Зотов   (2011-10-06 15:24:00) [20]


> Ega23 ©   (06.10.11 15:22) [56]

Тогда без меня...


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

Наверх

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