![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Закрытие формы в OnShow
Bless © (2006-08-21 10:57:00)Как закрыть форму в случае возникновения исключения в обработчике события OnShow.
Т.е. что-то в духе
procedure TForm1.FormShow(Sender: TObject);
begin
try
ViewData;
except
?????????; //Close? PostMessage(handle, WM_CLOSE, 0, 0)?
raise;
end;{try}
end;
что поставить вместо "?????????"
Ketmar (2006-08-21 22:22:00) [21]> [21] Leonid Troyanovsky © (21.08.06 22:12)
ну, я же не говорю, что мои слова суть догма. %-) просто логичнее таки выделять подобные ситуации и пытаться как-то их ловить ещё на этапе создания формы.
мне кажется, на подобном тоже стоит акцентировать внимание -- в итоге получается, имо, более ясный и логичный код. а то бегай потом по обработчикам, ищи, что они там ловят. %-)
я бы, например, долго удивлялся, если бы выяснил, что форму закрывают из OnShow(). ну не укладывается в моём однобитном мозгу связь между show и close. %-)
Leonid Troyanovsky (2006-08-21 22:12:00) [22]
> Ketmar © (21.08.06 21:16) [20]
> имо, исключение в OnShow() -- это что-то фатальное, и тут
> надо не просто форму закрывать, а писать лог и изничтожать
> всё приложение.
Уровень Application.OnException, как раз, IMHO, подходит
для принятия подобных решений.
Хотя, ничего извращенного нет, не так ли?
Ну, допустим, не получилось показать одну из форм.
Мало ли в Бразилии донов педров?
Хотя, конечно, предпочту исключение в конструкторе -
меньше прилагать мыс/мыш. усилий.
--
Regards, LVT.
Ketmar (2006-08-21 21:16:00) [23]нет, оно, конечно, понятно, что исключение может выскочить в любом месте. но, м.б., всё-таки пересмотреть логику кода? имо, исключение в OnShow() -- это что-то фатальное, и тут надо не просто форму закрывать, а писать лог и изничтожать всё приложение.
имо.
Leonid Troyanovsky (2006-08-21 20:22:00) [24]
> Loginov Dmitry © (21.08.06 19:54) [18]
> Не понял, в чем смысл такого стремления
Смысл оного - сделать поведение формы инвариантным
по отношению к юзеру.
Бо, OnShow, все же, событие для пользующего конкретный класс.
--
Regards, LVT.
Loginov Dmitry (2006-08-21 19:54:00) [25]Fay © (21.08.06 19:35) [16]
> procedure TQueerForm.DoShow;
> begin
> raise Exception.Create('!');
> inherited;
> end;
Не понял, в чем смысл такого стремления?
Leonid Troyanovsky (2006-08-21 19:51:00) [26]
> Fay © (21.08.06 19:35) [16]
> procedure DoShow; override;
Стремление, в общем-то, похвальное.
Однако, обработчика более высокого уровня не исключает.
--
Regards, LVT.
Fay (2006-08-21 19:35:00) [27]2 Loginov Dmitry © (21.08.06 19:14) [14][Ответить]
TQueerForm = class(TForm)
protected
procedure DoShow; override;
end;
....
procedure TQueerForm.DoShow;
begin
raise Exception.Create('!');
inherited;
end;
Leonid Troyanovsky (2006-08-21 19:18:00) [28]
> Loginov Dmitry © (21.08.06 19:14) [14]
> Это что-же за форма такая, в которой при одном только выводе
> на экран может возникнуть исключение.
> Изврат, имхо.
Проверено, паталогий нет.
Исключение имеет право быть везде, даже в правилах.
Бо, исключение.
--
Regards, LVT.
Loginov Dmitry (2006-08-21 19:14:00) [29]> Как закрыть форму в случае возникновения исключения в обработчике
> события OnShow.
Это что-же за форма такая, в которой при одном только выводе на экран может возникнуть исключение.
Изврат, имхо.
Leonid Troyanovsky (2006-08-21 18:38:00) [30]
> Bless © (21.08.06 17:09) [9]
> Вариант с PostMessage не работает, если после него стоит
> raise.
Нужно просто проникнуться логикой обработки исключений.
Т.е., твердо уяснить, что пропущенные (или re-raised) исключения обрабатываюся обработчиком следующего уровня.
Для форм вполне естественен уровень Application.OnException, т.е
type
TForm1 = class(TForm)
..
private
{ Private declarations }
public
{ Public declarations }
procedure AppExceptHandler(Sender: TObject; E: Exception);
end;
type
ExceptionShow = class (Exception);
implementation
..
procedure TForm1.AppExceptHandler;
begin
if E is ExceptionShow then
begin
Application.ShowException(E);
(Sender as TForm).Close;
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
..
raise ExceptionShow.Create('Invalid param');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := AppExceptHandler;
end;
--
Regards, LVT.
Пусик (2006-08-21 17:25:00) [31]
type
const
UM_RAISE=WM_USER+1;
TForm2 = class(TForm)
Image1: TImage;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
procedure OnUMRaise(var Msg: TMessage); message UM_RAISE;
{ Public declarations }
end;
procedure TForm2.FormShow(Sender: TObject);
begin
if <...> then PostMessage(Form2.Handle,UM_RAISE,0,0);
end;
procedure TForm2.OnUMRaise(var Msg: TMessage);
begin
Close;
raise Exception.Create('error');
end;
DevilDevil (2006-08-21 17:24:00) [32]MB_ICONERROR
DevilDevil (2006-08-21 17:23:00) [33]
> Bless © (21.08.06 17:09) [9]
Application.Terminateнадо вызывать послеShowMessage. А лучше так:
procedure TForm1.FormShow(Sender: TObject);
begin
try
ViewData;
except
Application.MessageBox(pchar(Exception(ExceptObject).message),
'Возникла ошибка: ', BM_ICONERROR);
Application.Terminate;
end;{try}
end;
<-- так как то получше будет
Bless (2006-08-21 17:09:00) [34]
> evvcom © (21.08.06 16:46) [8]
>
> А что у тебя с PostMessage проблемы? Или ты про модальные
> формы? Тогда вообще ModalResult ставишь в любое кроме mrNone
> и порядок, например, mrCancel или mrAbort. Выбирай, что
> больше нравится по смыслу.
Вариант с PostMessage не работает, если после него стоит raise.
Сейчас я вместо raise использую:
showmessage('Возникла ошибка: ' + Exception(ExceptObject).message)
exit;
и вроде пока хватает, но как-то мне это не сильно нравится. Вдруг когда понадобится именно raise, а я невооружен :)
Что касается модальных форм, то для их закрытия в OnShow, установка ModalResult не помогает.
Хотя, к моему удивлению, вариант [3] (с PostMessage) работает и для модальных форм тоже.
evvcom (2006-08-21 16:46:00) [35]А что у тебя с PostMessage проблемы? Или ты про модальные формы? Тогда вообще ModalResult ставишь в любое кроме mrNone и порядок, например, mrCancel или mrAbort. Выбирай, что больше нравится по смыслу.
Bless (2006-08-21 16:35:00) [36]
> DevilDevil © (21.08.06 15:19) [6]
>
> Нафиг PostMessage?
>
> Помоему Application.Terminate; читабельнее
Ну если в программе одна форма, то может и сойдет.
DevilDevil (2006-08-21 15:19:00) [37]Нафиг PostMessage?
ПомоемуApplication.Terminate;читабельнее
Bless (2006-08-21 15:12:00) [38]Что, никто не сталкивался с таким?
Чапаев (2006-08-21 12:01:00) [39]А. Наверное, PostMessage() таки исправит ситуацию. Не додумался в своё время. :-(
Bless (2006-08-21 11:30:00) [40]
> tesseract © (21.08.06 11:04) [1]
>
> попробуй
> try
>
> except
> on e:Exception do ........
> end;
В смысле без raise чтобы? Нужно именно с raise. Не то чтобы аж очень нужно, но хотелось бы знать, есть ли способы.
> Чапаев © (21.08.06 11:21) [2]
>
> С закрытием формы из OnShow действительно проблемы. Мне
> приходилось ставить таймер, который закрывал форму после
> небольшого промежутка времени
Для немодальных форм вроде бы работает такой вариант (без re-raise), имхо так удобней, чем с таймером :
procedure TForm1.FormShow(Sender: TObject);
begin
try
ViewData;
except
PostMessage(handle, WM_CLOSE, 0, 0)?
showmessage('Возникла ошибка: ' + Exception(ExceptObject).message);
// raise;
end;{try}
end;