Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

Закрытие формы в 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)
> страдали, но в другой форме, афаир. %-)
>

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


 
Ketmar ©   (2006-08-22 10:00) [41]

> [40] Германн ©   (22.08.06 03:15)
ну делают они прямое ShowWindow(), если не ошибаюсь. какого ангела -- не ясно.


 
Bless ©   (2006-08-22 11:48) [42]

Leonid Troyanovsky[13]>
Спасибо за пример.

<OFFTOP>
Пользуясь случаем, хотелось бы выразить вам свое уважение за толерантность к глупым вопросам и умение донести мысль до собеседника.
</OFFTOP>



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

Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.014 c
2-1157880067
YOjik
2006-09-10 13:21
2006.10.01
Как правильно передать указатель на объект


1-1155918541
msn777
2006-08-18 20:29
2006.10.01
Глюк расстановки мест под точки останова.


15-1157967587
Alex Bakulin
2006-09-11 13:39
2006.10.01
Автозапуск с Flash drive


15-1157977985
Tab
2006-09-11 16:33
2006.10.01
Кто как делает Разграничение доступа в программе?


2-1158303477
Std
2006-09-15 10:57
2006.10.01
Всплывющее окно в виндовом стиле





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский