![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно закрыть модальную форму из OnActivate?
IGray © (2012-06-18 13:59:00)Здравствуйте!
Собственно, сабж.
Упреждая вопрос "Зачем?" отвечаю сразу: "Затем."
"ModalResult := mrCancel" не работает.
Буду благодарен за конкретный ответ!
Дмитрий Белькевич (2012-06-26 01:18:00) [1]
> А как могут быть возбуждены события OnActivate или OnShow
> ДО вызова ShowModal?
+1.
Решение - код, который в онактивэйт - в отдельный метод формы. Его - вызывать перед ShowModal. Исключение - ShowModal не вызвется вообще.
Медвежонок Пятачок (2012-06-21 10:56:00) [2]И как ты предлагаешь обрабатывать исключения которые могут возникнуть в OnActivate или OnShow ДО вызова ShowModal??
try
код до шоумодал;
showmodal;
except
что-то там еще;
end
И чего? Супер сложно?
Cobalt (2012-06-21 09:51:00) [3]> IGray (21.06.12 03:54) [10]
> И как ты предлагаешь обрабатывать исключения которые могут
> возникнуть в OnActivate или OnShow ДО вызова ShowModal??
Если ты предполагаешь, что у тебя при вызове модальной формы на OnActivate или OnShow может возникнуть исключение (т.е. это у тебя в порядке вещей), то лучше вынести этот код в отдельный метод формы, и дергать его перед ShowModal.
А если это "на всякий случай", то овчинка не стоит выделки.
Германн (2012-06-21 04:00:00) [4]
> IGray (21.06.12 03:54) [10]
>
> > Если все гладко - делаем шоумодал, если исключение - не
> делаем.
>
> И как ты предлагаешь обрабатывать исключения которые могут
> возникнуть в OnActivate или OnShow ДО вызова ShowModal??
>
А как могут быть возбуждены события OnActivate или OnShow ДО вызова ShowModal?
IGray (2012-06-21 03:54:00) [5]> Если все гладко - делаем шоумодал, если исключение - не делаем.
И как ты предлагаешь обрабатывать исключения которые могут возникнуть в OnActivate или OnShow ДО вызова ShowModal??
Медвежонок Пятачок (2012-06-18 23:44:00) [6]Например - обработка исключений.
И чего?
Делаем что-то, готовые к исключению.
Если все гладко - делаем шоумодал, если исключение - не делаем.
Все логично и без извратов.
IGray (2012-06-18 18:12:00) [7]sniknik, спасибо за подробный ответ!
В принципе, мне и PostMessage подойдёт.
sniknik (2012-06-18 16:34:00) [8]
try
Show;
try
SendMessage(Handle, CM_ACTIVATE, 0, 0);
ModalResult := 0;
repeat
Application.HandleMessage;
if Application.FTerminate then ModalResult := mrCancel else
if ModalResult <> 0 then CloseModal;
until ModalResult <> 0;
Result := ModalResult;
SendMessage(Handle, CM_DEACTIVATE, 0, 0);
if GetActiveWindow <> Handle then ActiveWindow := 0;
finally
Hide;
end;
finally
событие активации в ShowModal синхронное - SendMessage(Handle, CM_ACTIVATE, 0, 0);
FOnActivate вызывается в конце события, следом идет ModalResult := 0; и цикл обработки сообщений... т.е. "чем быстрее это произойдёт - тем лучше", быстрее и так невозможно. до цикла обработки нечему и негде выходить. это если по нормальному, а так можешь в генофонде исправить, ModalResult := 0; на строчку выше перенести и посмотреть к чему приведет... (должен сработать код из 0, но последствия неизвестны)
sniknik (2012-06-18 16:12:00) [9]> PostMessage - штука асинхронная
только потому и работает, событие о закрытии приходит после события активации, т.е. после всех возможных в нем созданий/визуализаций компонент/еще чего...
т.е. чего бы ты не делал там до этого/вклиниваясь в.., но если в конце/после OnActivate стоит "показать форму" то ни к чему хорошему это не приведет.
> Хотя, насколько я понимаю, он тоже асинхронный..
да. именно поэтому и предложил/спросил...
IGray (2012-06-18 15:59:00) [10]> RWolf © (18.06.12 14:05) [1]
> PostMessage(Handle, WM_CLOSE, ...), не?
Спасибо! В целом - сойдёт, но есть "шероховатость": PostMessage - штука асинхронная, поэтому закроет форму не мгновенно, а мне чем быстрее это произойдёт - тем лучше. В идеале - синхронно, но SendMessage тут не работает.
> sniknik © (18.06.12 14:06) [2]
> а рекомендованный в справке Release
..может и подошёл бы, но глухо подвешивает программу при использовании в OnActivate. Хотя, насколько я понимаю, он тоже асинхронный..
> Медвежонок Пятачок © (18.06.12 14:47) [3]
> еще более интересный вопрос - зачем делать нечто с формой,
> что вызовет её активейт, если нам форма не нужна?
Например - обработка исключений. В случае исключения в OnActivate или OnShow "поломанную" форму хочу немедленно закрывать.
> Cobalt ©, спасибо, но это не мой случай.
Cobalt (2012-06-18 15:12:00) [11]
TMyForm.TryToShowModal;
begin
Result := mrNone;
if YesICan then
Result := ShowModal;
end
Медвежонок Пятачок (2012-06-18 14:47:00) [12]еще более интересный вопрос - зачем делать нечто с формой, что вызовет её активейт, если нам форма не нужна?
Нахрена ей бездумно делать шоумодал, если она не долдна показываться в определенных случаях?
sniknik (2012-06-18 14:06:00) [13]а рекомендованный в справке Release, или нужно именно, и только закрыть?
RWolf (2012-06-18 14:05:00) [14]PostMessage(Handle, WM_CLOSE, ...), не?