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