C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Событие при выключении компьютера, Событие при выключении компьютера
Alex_83
  Отправлено: 07.06.2004, 22:43


Не зарегистрирован







Во вовремя работы программы выключают компьютер и события destroy и close не срабатывают
какое должно быть событие у формы чтоб оно срабатывало при выключении компа?
klen
Отправлено: 07.06.2004, 22:53


Машинист паровоза

Группа: Участник
Сообщений: 239



Добавь обработчики сообщений WM_QUERYENDSESSION и WM_ENDSESSION и будет тебе счастье.
khram
Отправлено: 07.06.2004, 23:19


Не зарегистрирован







а можно поподробнее об WM_QUERYENDSESSION и WM_ENDSESSION
olegenty
Отправлено: 08.06.2004, 06:27


Ветеран

Группа: Модератор
Сообщений: 2412



в Windows SDK — подробней.

можешь всё перенести на главную форму.
дописать в конце определения формы:

CODE

protected:
   void __fastcall OnQueryEndSession(TMessage &Msg);
   void __fastcall OnEndSession(TMessage &Msg);
BEGIN_MESSAGE_MAP
   MESSAGE_HANDLER(WM_QUERYENDSESSION, TMessage, OnQueryEndSession);
   MESSAGE_HANDLER(WM_ENDSESSION , TMessage, OnEndSession);
END_MESSAGE_MAP (TForm)


роди соответствующие обработчики, в которых твоё приложение будет вызывать деструкторы, и тащись от собственной крутизны biggrin.gif
Alex_83
Отправлено: 08.06.2004, 08:14


Не зарегистрирован







так куда конкретно но втюхнуть мой код чтоб он выполнялся при выключении компьютера?
klen
Отправлено: 08.06.2004, 08:37


Машинист паровоза

Группа: Участник
Сообщений: 239



Мужик, ты че издеваешся над нами????!!!!

Тебе ж по русски все показали что надо сделать:

CODE

void __fastcall TTvoyGrebanyiClass::OnQueryEndSession(TMessage &Msg)
{
   ........ЗДЕСЯЯЯЯЯЯ.......
}

void __fastcall TTvoyGrebanyiClass::OnEndSession(TMessage &Msg)
{
   ........B TOT ВОТЗДЕСЯ.......
}
Admin
Отправлено: 08.06.2004, 08:51


Владимир

Группа: Администратор
Сообщений: 1190



Так написано:
приведенный код вставляете в .h Файл вашей формы,
видите, в примере он находится в секции protected,

читаем дальше:
QUOTE
роди соответствующие обработчики
smile.gif
рожаем обработчики — в .cpp файл формы вставляете эти функции:

CODE

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::OnQueryEndSession(TMessage &Msg)
{
 ShowMessage("QueryEndSession");
}

void __fastcall TForm1::OnEndSession(TMessage &Msg)
{
  ShowMessage("EndSession");
}


в которых вместо приведенного кода можно
написать что-нибудь другое.

---------------

Также можете пойти и другим путем:
обрабатывать событие формы onCloseQuery,
которое также возникает при завершении работы Windows
(Windows рассылает его всем окнам),
в обработчике этого события написать нужный Вам код,
и даже не дать закрыть форму и завершить работу Windows,
указав CanClose = false;

CODE

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
   ShowMessage("CloseQuery");
}
//---------------------------------------------------------------------------

olegenty
Отправлено: 08.06.2004, 09:58


Ветеран

Группа: Модератор
Сообщений: 2412



ещё вариант, тоже простой: переопределить WndProc главной формы, внеся туда код для обработки соответствующих событий. но, не зная, что там внутри делается, лучше всё же вариант с макросом BEGIN_MESSAGE_MAP

в MSVC++ есть ограничение: данный макрос ДОЛЖЕН БЫТЬ ПОСЛЕДНИМ в определении класса окна. не знаю, действительно ли это ограничение для C++Builder (а макросы у них хоть и одноимённые, но разные и несовместимые), но правила помещать макрос в конец определения класса не нарушаю...
Alex_83
Отправлено: 08.06.2004, 19:34


Не зарегистрирован







Все сделал как написал админ
с событием формы onCloseQuery
только вот теперь если моя прога включена комп выключатся не хочет
Что делать?
Admin
Отправлено: 08.06.2004, 20:24


Владимир

Группа: Администратор
Сообщений: 1190



Спросить пользователя, в обработчике этого события,
и если форму надо закрыть, то присвоить CanClose = true;

CODE

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
 if(Application->MessageBox("Close Form ?","Close",MB_YESNO) == IDYES)
    CanClose = true;  else CanClose = false;
}
//---------------------------------------------------------------------------
Alex_83
Отправлено: 08.06.2004, 21:19


Не зарегистрирован







присвол значение CanClose = true; во время события FormCloseQuery но компьтер все равно не хочет выключаться wink.gif
olegenty
Отправлено: 09.06.2004, 08:38


Ветеран

Группа: Модератор
Сообщений: 2412



корректно прописывать обработчики событий.

например в OnEndSession
определённый заранее флаг bool bShutDown = false

устанавливаешь

CODE

   bShutDown = true;


а в OnCloseQuery пишешь:
CODE

   if (bShutDown) CanClose = true;


должно работать

Вернуться в Вопросы программирования в C++Builder