![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ShowModal внутри try...except
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 можно создавать исключения, не теряющие информацию о месте возникновения предыдущего, но это изучи сам.