Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизКак правильно закрыть модальную форму из OnActivate? Найти похожие ветки
← →
IGray (2012-06-18 13:59) [0]Здравствуйте!
Собственно, сабж.
Упреждая вопрос "Зачем?" отвечаю сразу: "Затем."
"ModalResult := mrCancel" не работает.
Буду благодарен за конкретный ответ!
← →
RWolf © (2012-06-18 14:05) [1]PostMessage(Handle, WM_CLOSE, ...), не?
← →
sniknik © (2012-06-18 14:06) [2]а рекомендованный в справке Release, или нужно именно, и только закрыть?
← →
Медвежонок Пятачок © (2012-06-18 14:47) [3]еще более интересный вопрос - зачем делать нечто с формой, что вызовет её активейт, если нам форма не нужна?
Нахрена ей бездумно делать шоумодал, если она не долдна показываться в определенных случаях?
← →
Cobalt © (2012-06-18 15:12) [4]
TMyForm.TryToShowModal;
begin
Result := mrNone;
if YesICan then
Result := ShowModal;
end
← →
IGray (2012-06-18 15:59) [5]> 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 ©, спасибо, но это не мой случай.
← →
sniknik © (2012-06-18 16:12) [6]> PostMessage - штука асинхронная
только потому и работает, событие о закрытии приходит после события активации, т.е. после всех возможных в нем созданий/визуализаций компонент/еще чего...
т.е. чего бы ты не делал там до этого/вклиниваясь в.., но если в конце/после OnActivate стоит "показать форму" то ни к чему хорошему это не приведет.
> Хотя, насколько я понимаю, он тоже асинхронный..
да. именно поэтому и предложил/спросил...
← →
sniknik © (2012-06-18 16:34) [7]
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, но последствия неизвестны)
← →
IGray (2012-06-18 18:12) [8]sniknik, спасибо за подробный ответ!
В принципе, мне и PostMessage подойдёт.
← →
Медвежонок Пятачок © (2012-06-18 23:44) [9]Например - обработка исключений.
И чего?
Делаем что-то, готовые к исключению.
Если все гладко - делаем шоумодал, если исключение - не делаем.
Все логично и без извратов.
← →
IGray (2012-06-21 03:54) [10]> Если все гладко - делаем шоумодал, если исключение - не делаем.
И как ты предлагаешь обрабатывать исключения которые могут возникнуть в OnActivate или OnShow ДО вызова ShowModal??
← →
Германн © (2012-06-21 04:00) [11]
> IGray (21.06.12 03:54) [10]
>
> > Если все гладко - делаем шоумодал, если исключение - не
> делаем.
>
> И как ты предлагаешь обрабатывать исключения которые могут
> возникнуть в OnActivate или OnShow ДО вызова ShowModal??
>
А как могут быть возбуждены события OnActivate или OnShow ДО вызова ShowModal?
← →
Cobalt © (2012-06-21 09:51) [12]> IGray (21.06.12 03:54) [10]
> И как ты предлагаешь обрабатывать исключения которые могут
> возникнуть в OnActivate или OnShow ДО вызова ShowModal??
Если ты предполагаешь, что у тебя при вызове модальной формы на OnActivate или OnShow может возникнуть исключение (т.е. это у тебя в порядке вещей), то лучше вынести этот код в отдельный метод формы, и дергать его перед ShowModal.
А если это "на всякий случай", то овчинка не стоит выделки.
← →
Медвежонок Пятачок © (2012-06-21 10:56) [13]И как ты предлагаешь обрабатывать исключения которые могут возникнуть в OnActivate или OnShow ДО вызова ShowModal??
try
код до шоумодал;
showmodal;
except
что-то там еще;
end
И чего? Супер сложно?
← →
Дмитрий Белькевич (2012-06-26 01:18) [14]
> А как могут быть возбуждены события OnActivate или OnShow
> ДО вызова ShowModal?
+1.
Решение - код, который в онактивэйт - в отдельный метод формы. Его - вызывать перед ShowModal. Исключение - ShowModal не вызвется вообще.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.056 c