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;
|
должно работать
|
|