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

Вниз

Как правильно закрыть модальную форму из 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.052 c
1-1299075890
pvr
2011-03-02 17:24
2013.03.22
Заполнение странички с помощью TWebBrowser


15-1329440732
AlekseyK
2012-02-17 05:05
2013.03.22
Cломалась среда IDE


2-1340008979
webpauk
2012-06-18 12:42
2013.03.22
как впихнуть в ImageList иконку нестандартного размера


15-1348607335
MastaK
2012-09-26 01:08
2013.03.22
Передачи про животных


15-1335422333
Дмитрий С
2012-04-26 10:38
2013.03.22
Кадр из 112 серии интернов.