Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

Закрытие формы в OnShow   Найти похожие ветки 

 
Bless ©   (2006-08-21 10:57) [0]

Как закрыть форму в случае возникновения исключения в обработчике события OnShow.

Т.е. что-то в духе

procedure TForm1.FormShow(Sender: TObject);
begin
 try
   ViewData;
 except
   ?????????; //Close?  PostMessage(handle, WM_CLOSE, 0, 0)?
   raise;
 end;{try}
end;


что поставить вместо "?????????"


 
tesseract ©   (2006-08-21 11:04) [1]

попробуй
try

except
on e:Exception do ........
end;


 
Чапаев ©   (2006-08-21 11:21) [2]

С закрытием формы из OnShow действительно проблемы. Мне приходилось ставить таймер, который закрывал форму после небольшого промежутка времени.


 
Bless ©   (2006-08-21 11:30) [3]


> 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;


 
Чапаев ©   (2006-08-21 12:01) [4]

А. Наверное, PostMessage() таки исправит ситуацию. Не додумался в своё время. :-(


 
Bless ©   (2006-08-21 15:12) [5]

Что, никто не сталкивался с таким?


 
DevilDevil ©   (2006-08-21 15:19) [6]

Нафиг PostMessage?

Помоему Application.Terminate; читабельнее


 
Bless ©   (2006-08-21 16:35) [7]


> DevilDevil ©   (21.08.06 15:19) [6]
>
> Нафиг PostMessage?
>
> Помоему Application.Terminate; читабельнее


Ну если в программе одна форма, то может и сойдет.


 
evvcom ©   (2006-08-21 16:46) [8]

А что у тебя с PostMessage проблемы? Или ты про модальные формы? Тогда вообще ModalResult ставишь в любое кроме mrNone и порядок, например, mrCancel или mrAbort. Выбирай, что больше нравится по смыслу.


 
Bless ©   (2006-08-21 17:09) [9]


> 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) работает и для модальных форм тоже.


 
DevilDevil ©   (2006-08-21 17:23) [10]


> 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;


<-- так как то получше будет


 
DevilDevil ©   (2006-08-21 17:24) [11]

MB_ICONERROR


 
Пусик ©   (2006-08-21 17:25) [12]

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;


 
Leonid Troyanovsky ©   (2006-08-21 18:38) [13]


> 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.


 
Loginov Dmitry ©   (2006-08-21 19:14) [14]

> Как закрыть форму в случае возникновения исключения в обработчике
> события OnShow.


Это что-же за форма такая, в которой при одном только выводе на экран может возникнуть исключение.
Изврат, имхо.


 
Leonid Troyanovsky ©   (2006-08-21 19:18) [15]


> Loginov Dmitry ©   (21.08.06 19:14) [14]

> Это что-же за форма такая, в которой при одном только выводе
> на экран может возникнуть исключение.
> Изврат, имхо.


Проверено, паталогий нет.
Исключение имеет право быть везде, даже в правилах.
Бо, исключение.

--
Regards, LVT.


 
Fay ©   (2006-08-21 19:35) [16]

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:51) [17]


> Fay ©   (21.08.06 19:35) [16]

>  procedure DoShow; override;


Стремление, в общем-то, похвальное.
Однако, обработчика более высокого уровня не исключает.

--
Regards, LVT.


 
Loginov Dmitry ©   (2006-08-21 19:54) [18]

Fay ©   (21.08.06 19:35) [16]
> procedure TQueerForm.DoShow;
> begin
> raise Exception.Create("!");
> inherited;
> end;


Не понял, в чем смысл такого стремления?


 
Leonid Troyanovsky ©   (2006-08-21 20:22) [19]


> Loginov Dmitry ©   (21.08.06 19:54) [18]

> Не понял, в чем смысл такого стремления


Смысл оного - сделать поведение формы инвариантным
по отношению к юзеру.
Бо, OnShow, все же, событие для пользующего конкретный класс.

--
Regards, LVT.


 
Ketmar ©   (2006-08-21 21:16) [20]

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


 
Leonid Troyanovsky ©   (2006-08-21 22:12) [21]


> Ketmar ©   (21.08.06 21:16) [20]

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


Уровень Application.OnException, как раз, IMHO, подходит
для принятия подобных решений.

Хотя, ничего извращенного нет, не так ли?
Ну, допустим, не получилось показать одну из форм.
Мало ли в Бразилии донов педров?

Хотя, конечно, предпочту исключение в конструкторе -
меньше прилагать мыс/мыш. усилий.

--
Regards, LVT.


 
Ketmar ©   (2006-08-21 22:22) [22]

> [21] Leonid Troyanovsky ©   (21.08.06 22:12)
ну, я же не говорю, что мои слова суть догма. %-) просто логичнее таки выделять подобные ситуации и пытаться как-то их ловить ещё на этапе создания формы.
мне кажется, на подобном тоже стоит акцентировать внимание -- в итоге получается, имо, более ясный и логичный код. а то бегай потом по обработчикам, ищи, что они там ловят. %-)
я бы, например, долго удивлялся, если бы выяснил, что форму закрывают из OnShow(). ну не укладывается в моём однобитном мозгу связь между show и close. %-)


 
Германн ©   (2006-08-22 01:02) [23]


> Ketmar ©   (21.08.06 22:22) [22]
>
...
> я бы, например, долго удивлялся, если бы выяснил, что форму
> закрывают из OnShow(). ну не укладывается в моём однобитном
> мозгу связь между show и close. %-)
>

Я, конечно, не претендую на "правильность". Но вот лично я достаточно часто в OnShow главной формы приложения вызываю такие процедуры, которые не могут быть выполнены в OnCreate, поскольку другие формы ещё не созданы. А другие события главной формы для вызовов этих процедур мне не подходят по некоторым причинам. Продолжение работы в данном случае не имеет смысла. Поэтому только Close с соответствующими сообщениями или записями в лог.
Очень возможно, что я в большинстве случаев и не прав! И что можно было бы найти иной путь. Но для этого нужно либо обладать опытом разработки приложений не меньше чем у ЮЗ, либо иметь в штате фирмы соответствующих специалистов.


 
Ketmar ©   (2006-08-22 01:09) [24]

> [23] Германн ©   (22.08.06 01:02)
давай начнём с того, хотя бы, что OnShow() может вызываться и не один раз. что само по себе должно родить смутные подозрения: "а то ли я делаю, запихивая туда какие-то инициализации?"

а порядок создания форм -- он того... в .dpr лежит. тут, как выход "в лоб", например -- посылать сообщение "всё создано, давай, инициализируйся" в соответствующем месте. конкретно же -- нужно на конкретныый проект смотреть.

а я от того и намекаю про OnShow(), чтобы народ не привыкал к странному. %-)

зыж эх... если я такой умный, то почему почти безработный? %-)


 
Германн ©   (2006-08-22 01:18) [25]


> Ketmar ©   (22.08.06 01:09) [24]
>
> > [23] Германн ©   (22.08.06 01:02)
> давай начнём с того, хотя бы, что OnShow() может вызываться
> и не один раз. что само по себе должно родить смутные подозрения:
>  "а то ли я делаю, запихивая туда какие-то инициализации?
> "
Не один раз для главной формы!?
>
> а порядок создания форм -- он того... в .dpr лежит. тут,
>  как выход "в лоб", например -- посылать сообщение "всё
> создано, давай, инициализируйся" в соответствующем месте.
>  конкретно же -- нужно на конкретныый проект смотреть.
>
Не надо на него смотреть. Я стесняюсь. :-)

> а я от того и намекаю про OnShow(), чтобы народ не привыкал
> к странному. %-)
>
Это не "странное". Имхо. Может быть "не продуманное" в ряде случаев, но не странное.

> зыж эх... если я такой умный, то почему почти безработный?
>  %-)
А что значит "почти"?
>


 
Ketmar ©   (2006-08-22 01:28) [26]

> [25] Германн ©   (22.08.06 01:18)
> Не один раз для главной формы!?
"Occurs when the form is shown (that is, when its Visible property is set to true)." (ц)

> Не надо на него смотреть. Я стесняюсь
бывает. я своего тоже иногда. %-)

> Может быть "не продуманное" в ряде случаев, но не странное
так это я и назвал здесь "странным".

> что значит "почти"?
то, что на увольнение я уже подал, а нового ничего не предвидится. %-)


 
Германн ©   (2006-08-22 01:46) [27]


> > [25] Германн ©   (22.08.06 01:18)
> > Не один раз для главной формы!?
> "Occurs when the form is shown (that is, when its Visible
> property is set to true)." (ц)

Ну это цитата из хэлпа.  Причём хэлпа по TForm. А из реальной жизни? Про "главную форму приложения"?


 
Ketmar ©   (2006-08-22 01:52) [28]

> [27] Германн ©   (22.08.06 01:46)
fmMain.Hide(); fmMain.Show(). как это применить -- придумай сам. %-))


 
Германн ©   (2006-08-22 01:56) [29]


> Ketmar ©   (22.08.06 01:52) [28]
>
> > [27] Германн ©   (22.08.06 01:46)
> fmMain.Hide(); fmMain.Show(). как это применить -- придумай
> сам. %-))
>

Вот именно это я и просил тебя придумать для реальной жизни. Так что не сваливай на меня. :-)


 
Ketmar ©   (2006-08-22 02:00) [30]

> [29] Германн ©   (22.08.06 01:56)
уломал. %-) работа с базой. в программе несколько форм ввода. делать вкладками -- никаких ресурсов не хватит, да и не всегда удобно. маячащее же на экране главное окно идеологически вредно и объявлено диверсией. пример из моей реальной жизни. %-)


 
Германн ©   (2006-08-22 02:12) [31]


> Ketmar ©   (22.08.06 02:00) [30]
>
> > [29] Германн ©   (22.08.06 01:56)
> уломал. %-) работа с базой. в программе несколько форм ввода.
>  делать вкладками -- никаких ресурсов не хватит, да и не
> всегда удобно. маячащее же на экране главное окно идеологически
> вредно и объявлено диверсией. пример из моей реальной жизни.
>  %-)
>

Другой бы на моём месте написАл бы что-то типа 1:1! Но я скромно молчу :-)


 
Ketmar ©   (2006-08-22 02:16) [32]

> [31] Германн ©   (22.08.06 02:12)
другой бы намекнул мне про MDI -- для поддержания трё... пардон, обмена мнениями. %-)


 
Германн ©   (2006-08-22 02:31) [33]


> Ketmar ©   (22.08.06 02:16) [32]
>
> > [31] Германн ©   (22.08.06 02:12)
> другой бы намекнул мне про MDI -- для поддержания трё...
>  пардон, обмена мнениями. %-)

Наверно, это кто-то "совсем" другой :-)
Но регулярно скрывать, показывать, снова скрывать и снова показывать MDI форму - это изврат, имхо.


 
Ketmar ©   (2006-08-22 02:35) [34]

> [33] Германн ©   (22.08.06 02:31)
как будто с не-MDI это извратом быть перестаёт. %-)


 
Германн ©   (2006-08-22 02:43) [35]


> Ketmar ©   (22.08.06 02:35) [34]
>
> > [33] Германн ©   (22.08.06 02:31)
> как будто с не-MDI это извратом быть перестаёт. %-)
>

Не, ну таки да.  Но ты сам упомянул  про MDI в ответ на Германн ©   (22.08.06 02:12) [31] А других ответов на сей вопрос ты пока что не дал. :-(


 
Джо ©   (2006-08-22 02:46) [36]

Ну, вот вам еще пример из "реальной". Запуздыриваем иконку, форму прячем. Распуздыриваем — показываем :)


 
Ketmar ©   (2006-08-22 02:48) [37]

> [36] Джо ©   (22.08.06 02:46)
да, я об этом сразу подумал. даже написал было... но так же неинтересно. %-)


 
Германн ©   (2006-08-22 03:03) [38]


> Джо ©   (22.08.06 02:46) [36]
>
> Ну, вот вам еще пример из "реальной". Запуздыриваем иконку,
>  форму прячем. Распуздыриваем — показываем :)

Ну да. Если "запуздыриваем", то с нас и спрос.
А вот ребята, которые писАли RxLib этой болячкой не страдали!


 
Ketmar ©   (2006-08-22 03:11) [39]

> [38] Германн ©   (22.08.06 03:03)
страдали, но в другой форме, афаир. %-)


 
Германн ©   (2006-08-22 03:15) [40]


> Ketmar ©   (22.08.06 03:11) [39]
>
> > [38] Германн ©   (22.08.06 03:03)
> страдали, но в другой форме, афаир. %-)
>

Страдали или нет - это другой вопрос. Но уж точно не этой болячкой!
Проверено на реальном проекте!



Страницы: 1 2 вся ветка

Текущий архив: 2006.10.01;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.036 c
15-1157876075
kull
2006-09-10 12:14
2006.10.01
Какой браузер лучше?


2-1157979420
Viktop
2006-09-11 16:57
2006.10.01
Запуск bat-файлов


2-1157718051
drashka
2006-09-08 16:20
2006.10.01
Incompatible types: TBasicAction and TCloseAction


15-1158135522
QuickFinder
2006-09-13 12:18
2006.10.01
Audio -> MP3


4-1148668623
PRT
2006-05-26 22:37
2006.10.01
как поменять свойство ReadOnly контрола в чужом приложении ??