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

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

ShowModal внутри try...except


Страницы:   1 2

IGray ©   (2012-06-13 14:40:00) 

Здравствуйте! Есть простой код:

procedure TForm1.Button1Click(Sender: TObject);
begin
 try
   Form2.Showmodal;
 except
   on E: Exception do
      ShowMessage(E.Message);
 end;
end;

На второй форме куча кнопок, при нажатии на каждую из которых может сгенериться необрабатываемое исключение.
Сейчас при этом вызывается дефолтный обработчик, форма остаётся открытой и except..end никогда не выполняется, а мне бы хотелось чтобы форма автоматически закрылась и возникшее исключение попало во внешний блок except..end
Это возможно как-нибудь организовать?
Заранее спасибо!
Сорри, если туплю..


IGray   (2012-06-15 21:50:00) [21]

icWasya, KSergey, Palladin - большое Вам спасибо!
Раньше не мог ответить, сорри..

Интересно, если таких форм как Form2 много можно ли как-то оптимизировать код, чтобы не нужно было на каждую кидать TApplicationEvents и описывать метод Execute?
Сейчас думаю над этим..

> Откуда такое желание возникло?
Оно возникло из желания воспринимать вызов Showmodal так же, как и вызов любой другой процедуры или метода - иметь возможность заключить его в try..except и выполнить внутри except..end некие действия в случае необработанного исключения. Вполне возможно, что я хочу чего-то "не того" в следствии недопонимания идеологии Борланда по обработке таких исключений - тогда очень прошу наставить меня "на путь истинный" ;)
Я просто действительно хочу понять насколько нестандартным является моё желание и, соответственно, предложенное решение.

P.S. Palladin, проблема в том, что блок except..end не выполнится _никогда_.


Loginov Dmitry   (2012-06-14 22:47:00) [22]

Откуда такое желание возникло?


Loginov Dmitry   (2012-06-14 22:47:00) [23]


> Сейчас при этом вызывается дефолтный обработчик, форма остаётся
> открытой и except..end никогда не выполняется, а мне бы
> хотелось чтобы
форма автоматически закрылась и возникшее
> исключение попало во внешний блок except..end
> Это возможно как-нибудь организовать?
> Заранее спасибо!
> Сорри, если туплю..


Palladin   (2012-06-13 17:43:00) [24]

procedure TForm1.Button1Click(Sender: TObject);
begin
 try
   Form2.Showmodal;
 except
   Form2.Close
   raise;
 end;
end;


KSergey   (2012-06-13 17:35:00) [25]

Тип возникшего исключения можно запомнить в переменной типа ExceptClass.


icWasya   (2012-06-13 16:16:00) [26]

Прямо так не получится. Каждое событие типа OnButtonEvent вызывается изнутри блока Try - Except и по выходе из блока event уничтожается.
Частично можно съымитировать таким образом.
1)добавить в форму TForm2 компонент ЕApplicationEvents и прописать у него событие OnException, а также добавить

private
 FMessage:String;
public
 procedure Execute;

...
implementation

procedure TForm2.ApplicationEvents1Exception(Sender: TObject;
 E: Exception);
begin
 FMessage:=E.Message;
 ModalResult:=100;
end;

procedure TForm2.Execute;
begin
 if ShowModal = 100 then
   raise Exception.Create(FMessage);
end;


А в форме Form1 чуть изменить обработчик нажатия на кнопку

procedure TForm1.Button1Click(Sender: TObject);
begin
try
  Form2.Execute;//<<======
except
  on E: Exception do
     ShowMessage(E.Message);
end;
end;


Правда при этом теряется информация о типе исключения и месте кго возникновения.
В новых версиях Дельфи, кажется начиная с D2010, в блоке Except можно создавать исключения, не теряющие информацию о месте возникновения предыдущего, но это изучи сам.


Страницы:   1 2

Наверх

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