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

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

Закрытие формы в OnShow


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

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;


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

Наверх

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