| 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) 
 |  
 
  
роди соответствующие обработчики, в которых твоё приложение будет вызывать деструкторы, и тащись от собственной крутизны  
 | 
  | 
| 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  |  | роди соответствующие обработчики |      
рожаем обработчики — в .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 но компьтер все равно не хочет выключаться    | 
  | 
| olegenty | 
| Отправлено: 09.06.2004, 08:38 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 2412 
  
  
 | 
 корректно прописывать обработчики событий.
  
например в OnEndSession 
определённый заранее флаг bool bShutDown = false
  
устанавливаешь
  
  
а в OnCloseQuery пишешь: 
| CODE  |   
   if (bShutDown) CanClose = true; 
 |  
 
  
должно работать
 | 
  |