Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2012, 09:05   #1
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию Сообщение при закрытии программы в CloseQuery

Здравствуйте. Есть такой код:
Код:
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if MessageBox (Handle, 'Вы действительно желаете закрыть программу?',
    'Выход', MB_YESNO or MB_ICONQUESTION)=mrNo then
      CanClose := false;
end;
Т.е. если в программе где нибудь вызвать метод Close или нажать на крестик в системном меню формы, выходит это сообщение. Но проблема в том, что это же сообщение вызывается при завершении работы Винды, т.к. она тоже посылает сообщение всем окнам WM_CLOSE. И винда ждёт ответа от юзера, пока он не нажмёт кнопку. Вот как этого избежать? Чтобы при завершении винды, это сообщение не обрабатывалось, а просто программа закрывалась? Т.е. сообщение показывалось, только тогда, когда закрытие происходит из формы программы.
Заранее Благодарен за ответ.
FaTaL вне форума Ответить с цитированием
Старый 05.05.2012, 09:12   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Как-то решал аналогичную проблемы. Использовал WM_QUERYENDSESSION (здесь подсказали), помогло
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.05.2012, 11:01   #3
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Что-то поиск ничего не даёт. Может пример кините?
FaTaL вне форума Ответить с цитированием
Старый 05.05.2012, 11:10   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

для меня как-то была актуальная эта проблема.
Суть в чем:
CQ выдается в лбюом случае, но после QENDSESSION.
Встыкаем глоб. переменную BOOL.
Когда получаем сообщение системы, ставим нашу переменную TRUE, а в обработке CQ проверяем переменную, и не выдаем никаких сообщенией типа MessageBox.....
Человек_Борща вне форума Ответить с цитированием
Старый 05.05.2012, 11:39   #5
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Т.е. сначала идёт сообщение WM_QUERYENDSESSION, а потом только срабатывает OnCloseQuery?
FaTaL вне форума Ответить с цитированием
Старый 05.05.2012, 19:23   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
...
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
...
    lCanClose: Boolean;
...
procedure TFMain.FormCreate(Sender: TObject);
begin
  ...
  lCanClose:=False;
end;

procedure TFMain.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
  lCanClose:=True;
  inherited;
end;

procedure TFMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:=lCanClose;
  if CanClose then Exit;
  ...
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.05.2012, 20:01   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Т.е. сначала идёт сообщение WM_QUERYENDSESSION, а потом только срабатывает OnCloseQuery?
нет.
OnCloseQuery это метод самой формы, который вызывается в OnClose.
Пример вам показал Аватар.
Человек_Борща вне форума Ответить с цитированием
Старый 10.05.2012, 09:19   #8
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Аватар, спасибо большое за предоставленный код. Очень помог. Человек_Борща, спасибо за разъяснение принципа.
FaTaL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автозапуск при закрытии программы soniag Общие вопросы Delphi 2 21.02.2012 11:56
Ошибка при закрытии программы cargo29 Общие вопросы Delphi 10 17.05.2011 23:31
при закрытии потока(Tthread) посылать на форму код ответа или сообщение Человек_Борща Общие вопросы Delphi 2 14.12.2010 21:19
Ошибка при закрытии программы Crystallon Общие вопросы Delphi 17 23.08.2010 21:07
Как сделат так, что бы при закрытии проекта появлялось сообщение monushka Помощь студентам 7 02.11.2007 08:12