Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.076 c
15-1343963444
Павиа
2012-08-03 07:10
2013.03.22
Калькулятор


15-1330443309
pasha_golub
2012-02-28 19:35
2013.03.22
IPC в MacOS&amp;Win средствами Delphi XE2


15-1336765355
Rouse_
2012-05-11 23:42
2013.03.22
Схемы защиты ПО


2-1338968631
AV
2012-06-06 11:43
2013.03.22
Помогите написать команду к Excel. Скрыть промежуточные итоги.


15-1352053320
Artem
2012-11-04 22:22
2013.03.22
Где internet explorer хранит куки в windows 7?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский