Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 263
от 07.12.2005, 20:45

Администратор:Калашников О.А.
В рассылке:Подписчиков: 250, Экспертов: 41
В номере:Вопросов: 3, Ответов: 9


Вопрос № 30618: Зравствуйте, эксперты! Пишу на Builder. Нужно написать обработчик закрытия формы, т.е. при нажатии на крестик (или каким либо другим способом) перед закрытием приложения должно выполняться любое действие. В хелпе нашел действие FormClose, но что-то о...
Вопрос № 30619: Уважаемые эксперты, еще один вопрос в догонку к №30618. Как убрать отображение программы на Панели задач Windows? Заранее спасибо за все ответы...
Вопрос № 30646: Доброго дня, Эксперты! Надо сохранить данные перед завершением работы Винды... Ну после того как пользователь нажмет Пуск->Завершение работы->Выключить комп... Теперь по подробнее: Пишу прогу - Прога висит в трее, поль...

Вопрос № 30.618
Зравствуйте, эксперты! Пишу на Builder. Нужно написать обработчик закрытия формы, т.е. при нажатии на крестик (или каким либо другим способом) перед закрытием приложения должно выполняться любое действие. В хелпе нашел действие FormClose, но что-то оно не срабатывает... или я что-то не так делаю? Подскажите пожалуйста.

Приложение:

Отправлен: 02.12.2005, 07:09
Вопрос задал: Дмитрий Федоров (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jadd
Здравствуйте, Дмитрий Федоров!
Есть событие, которое посылается окну перед его уничтожением (закрытием) - WM_DESTROY. Можно ловить его, написав обработчик, а можно пользоваться тем, что уже сделали программеры борланда. Я говорю про OnCloseQuery. Вот там можно сделать то, что нужно, в добавок, можно вообще сделать так, чтобы форма не закрывалась. Удачи.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 02.12.2005, 08:36
Оценка за ответ: 5
Комментарий оценки:
все работает. спасибо

Отвечает: Кошелев АВ
Здравствуйте, Дмитрий Федоров!
Попробуйте привести вызов MessageDlg() к виду, приведенному ниже, т.е. убрать последние два параметра. Я на билдере не программирую, но Ваш код у меня выдал ошибку. Приведенный ниже в хелпе билдера назван как On Windows, а тот, что у вас - On Cross-platform :) И On Windows у меня работает как это от него ожидается.

Приложение:

Ответ отправил: Кошелев АВ (статус: 1-ый класс)
Отправлен: 02.12.2005, 08:54
Оценка за ответ: 3
Комментарий оценки:
ошибка действительно там была, но дело было не мессадже, не происходила обработка запроса закрытия формы, нужно было привязаться к Events'ам

Отвечает: __Cheat3r
Здравствуйте, Дмитрий Федоров!
Пользуйтесь OnCloseQuery

void __fastcall TfrmMain::FormCloseQuery(TObject *Sender, bool &CanClose)
{

if ( (Application->MessageBox("Выйти?",
"Выход", MB_YESNO | MB_ICONWARNING) ) == IDYES){
CanClose=true ;

}
else{
CanClose=false ;
}
}

Ответ отправил: __Cheat3r (статус: 1-ый класс)
Отправлен: 03.12.2005, 07:18


Вопрос № 30.619
Уважаемые эксперты, еще один вопрос в догонку к №30618.
Как убрать отображение программы на Панели задач Windows?
Заранее спасибо за все ответы
Отправлен: 02.12.2005, 07:58
Вопрос задал: Дмитрий Федоров (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ataman N. N.
Здравствуйте, Дмитрий Федоров!
Можно примерно так:
при создании формы пропишите такой код

procedure TForm1.Create(Sender: TObject);
begin
Show(SW_HIDE);
end;
Ответ отправил: Ataman N. N. (статус: 3-ий класс)
Отправлен: 02.12.2005, 18:53

Отвечает: Slava_
Здравствуйте, Дмитрий Федоров!

Можно и API-функцией
ShowWindow(hwnd(окна програмки,которую нужно скрыть с панели задач),SW_HIDE);

Например так убирается калькулятор(естественно если он запущен)
ShowWindow(FindWindow("SciCalc","Calculator"),SW_HIDE);
или
ShowWindow(FindWindow("SciCalc","Калькулятор"),SW_HIDE);
Ответ отправил: Slava_ (статус: 1-ый класс)
Отправлен: 02.12.2005, 19:33

Отвечает: Dmitriy
Здравствуйте, Дмитрий Федоров!
вот такой функцией
SetWindowLong(Application->Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
описанной в WinUser.h
---------
В жизни нет ничего невозможного
Ответ отправил: Dmitriy (статус: 5-ый класс)
Отправлен: 03.12.2005, 21:39


Вопрос № 30.646
Доброго дня, Эксперты!

Надо сохранить данные перед завершением работы Винды... Ну после того как пользователь нажмет Пуск->Завершение работы->Выключить комп...

Теперь по подробнее:
Пишу прогу -
Прога висит в трее, пользователь переодически к ней обращается и заносит данные в нее, и тут он хочет завершить по пыренькому свои дела и ему, соответственно, некогда нажать сохранить, он выходит из винды и ничего не сохраняется...

Так вот как можно такого избежать, кроме автосейва каждые 5 секунд?
Отправлен: 02.12.2005, 18:48
Вопрос задал: Zitz (статус: 2-ой класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: estiGi
Здравствуйте, Zitz!
Можно повешаться на системное сообщение о закрытии, непомню какое :) Что то вроде WM_QUERY... ...не помню. Оно рассылается перед выключением. Если сильно важно, могу потом посмотреть или кто то подскажет.
А тебе нужно просто вешаться на свое сообщение о закрытии программы - WM_CLOSE или WM_DESTROY. Если систему корректно выключать, то она рассылает сообщение о закрытии всем процессам, чтобы они себя корректно позакрывали перед выключением.
Ответ отправил: estiGi (статус: 8-ой класс)
Отправлен: 02.12.2005, 19:03
Оценка за ответ: 2
Комментарий оценки:
Я наверное огорчу Вас но очевидно Винда 2000 некоректо завершает мое приложение... Да и WM_QUERYENDSESSION тоже отчего-то не робит...
А для меня это сильно важно...

Отвечает: Jadd
Здравствуйте, Zitz!
Смотря в какой среде пишете. Если C++ Builder, тогда пишете обработчик для OnCloseQuery. Если Visual C++ или любой другой - пишете обработчик на сообщение WM_DESTROY и в своем хэндлере пишете сохранение данных. WM_DESTROY - сообщение, приходящее до того, как окно уничтожается.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 02.12.2005, 19:16
Оценка за ответ: 4
Комментарий оценки:
Сейчас скажу смешную вещь - на Билдере работает!!!
А вот на вижел С... Толи я чего не понял... (сразу уточню - у меня вс6) Но WM_CREATE у меня только на старте... А про WM_DESTROY уже писал...
Прога на ВижелС6... Я нид хелп!!!

Отвечает: Антон aka LogRus
Здравствуйте, Zitz!

Все программы полуают стандартное сообщение о закрытии, всё равно, что по Alt-F4 окно закрыть, вообщем Windows пытается штатно закрыть программу. Его и ловите, можете даже диалог вывести с предложением сохранить настройки, рекомендую совместить с периодическим сохранением, на случай если по кнопке ресет убьют машину.

Думаю найти доку как отловить событие закрытия приложения не составит для вас труда.
Ответ отправил: Антон aka LogRus (статус: 1-ый класс)
Отправлен: 02.12.2005, 22:35
Оценка за ответ: 1
Комментарий оценки:
Мне надоело отвечать на одно и тоже... Почитайте отзывы на ответы других экспертов!
Конкретно Аль+ф4 можно отловить по сискомманд, но это никак не связано с моим вопросом...
Про периодическое сохранение писал в вопросе...
Если случается ресет то это не является стандартом эксплуатации (все равно что из винды винду грохнуть и сказать что-то у меня не грузиться)
Если мне не верите то можете сами попробывать - создайте новое диалоговое приложение, на дестрой загрузите мессаджбокс, запустите приложение, нажмите пуск завержение работы выключить комп и посмотрите выскачит ли мессаджбокс!


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100 hotlog_js="1.0"; hotlog_r=""+Math.random()+"&s=314124&im=101&r="+escape(document.referrer)+"&pg="+ escape(window.location.href); document.cookie="hotlog=1; path=/"; hotlog_r+="&c="+(document.cookie?"Y":"N"); hotlog_js="1.1";hotlog_r+="&j="+(navigator.javaEnabled()?"Y":"N") hotlog_js="1.2"; hotlog_r+="&wh="+screen.width+'x'+screen.height+"&px="+ (((navigator.appName.substring(0,3)=="Mic"))? screen.colorDepth:screen.pixelDepth) hotlog_js="1.3" hotlog_r+="&js="+hotlog_js; document.write("HotLog")

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Архив рассылки
Отписаться
Вспомнить пароль

В избранное