Форум: "Основная";
Текущий архив: 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)
> страдали, но в другой форме, афаир. %-)
>
Страдали или нет - это другой вопрос. Но уж точно не этой болячкой!
Проверено на реальном проекте!
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.015 c