![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректное завершение работы программы при выключении ПК [D7, 2000]
azl © (2005-12-29 11:40:00)Привет, всем.
Подскажите, пожалуйста, как корректно завершить работу программы при выключении компьютера? Понятно, что можно закрыть вручную, но, мне нужно чтобы программа корректно завершала свою работу, находясь запущенной с трее (в моем случае), когда делается завершение работы Windows или перезагрузка.
Я нашел в инете, следующее:
Application.Terminated := true
А вот где это писать? OnDestroy?
Или может как-то по-другому?
Спасибо.
Leonid Troyanovsky (2006-01-03 15:30:00) [1]
> Германн © (02.01.06 02:32) [20]
> программе я могу отменить это завершение. Но что делать,
> если уже самой системой завершены один или несколько процессов,
> которые мне нужны для работы?
Проще сразу завершиться.
В конце-концов, это не такой большой грех, как отказ при логофе.
--
Regards, LVT.
Германн (2006-01-02 02:32:00) [2]2 Leonid Troyanovsky © (01.01.06 14:27) [19]
> Например,
>
> http://groups.google.com/group/fido7.ru.delphi.chainik/msg/308deb5e10abdcbb
Нет. Я не про то, как отличить один вид завершения программы от другого, а про то, что при завершении программы самим пользователем, завершается лишь она сама. А при завершении Windows каким-либо способом, завершается часть процессов на данный момент работающих, в том числе и моего. В своей программе я могу отменить это завершение. Но что делать, если уже самой системой завершены один или несколько процессов, которые мне нужны для работы?
Leonid Troyanovsky (2006-01-01 14:27:00) [3]
> Германн © (31.12.05 02:34) [18]
> 2 Leonid Troyanovsky © (30.12.05 11:12) [17]
> А причём тут пример из справки?
Потому, что это пример как не надо делать обработчик OnCloseQuery.
> 2. Приложение может быть закрыто при презагрузке ОС/смене
> пользователя/перезагрузке компьютера. А вот тут - совершенно
> непонятно как быть?
Например,
http://groups.google.com/group/fido7.ru.delphi.chainik/msg/308deb5e10abdcbb
Пожалуй, только вместо msg.Result := LParam(True);
точнее inherited.
--
Regards, LVT.
Германн (2005-12-31 02:34:00) [4]2 Leonid Troyanovsky © (30.12.05 11:12) [17]
А причём тут пример из справки?
Суть то ведь в том, имхо, что нужны одновременно две вещи.
1. Переспросить пользователя - "действительно ли он хочет закрыть своё приложение, если он/оно что-то не доделал/доделело?" Если этот самый пользователь пытается закрыть это приложение, то - отмена закрытия, имхо, вполне нормальное решение.
2. Приложение может быть закрыто при презагрузке ОС/смене пользователя/перезагрузке компьютера. А вот тут - совершенно непонятно как быть?
Leonid Troyanovsky (2005-12-30 11:12:00) [5]
> Германн © (30.12.05 02:09) [16]
> А я - так вообще ничего не понял. Что именно помогло автору.
Видимо, код завершения находится в OnClose, поэтому
потребовалось вызывать принудительно Close.
> Имхо, OnCloseQuery позволяет отменить закрытие приложения,
> но не гарантирует нормальную работу его в случае отмены
> закрытия, если оно вызвано выключением/перезагрузкой/сменой
Дык, зачем отменять закрытие, если оно вызвано перезагрузкой?
Просто, с отменой закрытия надо быть аккуратней - from Forms:
procedure TCustomForm.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
Message.Result := Integer(CloseQuery and CallTerminateProcs);
end;
Т.е., такому как Delphi help: TCustomForm.OnCloseQuery example -
место в корзине.
--
Regards, LVT.
Германн (2005-12-30 02:09:00) [6]А я - так вообще ничего не понял. Что именно помогло автору.
А по поводу
> Leonid Troyanovsky © (29.12.05 18:13) [15]
>
>
> > azl © (29.12.05 17:13) [14]
>
>
> Достаточно было б просто поместить код корректного завершения
> в обработчик OnCloseQuery формы.
можно высказаться?
Имхо, OnCloseQuery позволяет отменить закрытие приложения, но не гарантирует нормальную работу его в случае отмены закрытия, если оно вызвано выключением/перезагрузкой/сменой пользователя. Поскольку какие-то другие приложения/процессы уже могут быть отключены. Я вообще не знаю - известен ли порядок отключения процессов при выключении/перезагрузке и т.д?
Так что лучше поместить код корректного завершения в обработчик OnClose формы. Имхо.
Leonid Troyanovsky (2005-12-29 18:13:00) [7]
> azl © (29.12.05 17:13) [14]
Достаточно было б просто поместить код корректного завершения
в обработчик OnCloseQuery формы.
Корректного в сысле: сделать необходимые действия по сохранению
нужного, но не Application.Terminate, который сделают и без нас.
--
Regards, LVT.
azl (2005-12-29 17:13:00) [8]Вот нашел выход:
unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure WMQueryEndSession(
var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
public
{ Public declarations }
end;
var
Form1 : TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
inherited;
Form1.Close;
end;
http://www.i2n.ru/article/print.php?id=19
Вроде бы помогло.
evvcom (2005-12-29 16:50:00) [9]
> если некорректно завершаешь работу программы
а при чем тут парадокс? Пока post не сделал, запись в буфере редактирования еще лежит. Когда сделал, может попасть в кеш компонента доступа к БД, если кеш используется. Потом еще у движка свой кеш имеется. Не будет же движок при каждом твоем чихе жесткий диск дергать!
> Нет, везде Post стоит
Тогда только Digitman © (29.12.05 14:43) [7] вроде остается.
Германн (2005-12-29 16:49:00) [10]DBISaveChanges могут помочь отцу русской демократии.
azl (2005-12-29 16:31:00) [11]
> evvcom ©
Нет, везде Post стоит. Я так понял, это у Paradox'a такая особенность, если некорректно завершаешь работу программы, например, через Ctrl+Alt+Del, то записи не сохраняются.
evvcom (2005-12-29 15:45:00) [12]угу, а еще
> Добавляю новую запись, делаю завершение сеанса пользователя,
> при этом программа запущена, загружаюсь запускаю программу
> записи нет.
надо проанализировать, а не находится ли набор в состоянии dsEdit или dsInsert и если да, то Post не забыть. А то Close сам тебе Post не сделает. :)
Digitman (2005-12-29 14:58:00) [13]туеву хучу оных найдешь, набрав "Delphi WM_QUERYENDSESSION" в кач-ве модели поиска в Гугле
azl (2005-12-29 14:54:00) [14]А пример можно?
Digitman (2005-12-29 14:43:00) [15]если не ошибаюсь, следует обрабатывать событие Application.OnMessage, в коем собссно и анализировать поступающие сообщения на предмет обнаружения WM_QUERYENDSESSION
azl (2005-12-29 14:36:00) [16]Я извиняюсь, но может я что-то неправильно сделал. В моей ситуации не работает. Если не затруднит, скажите, что я делаю не так.
Спасибо.
Digitman (2005-12-29 14:13:00) [17]
> Это не работает
это РАБОТАЕТ.
будучи примененным не от балды и с полным пониманием происходящего
azl (2005-12-29 14:02:00) [18]Это не работает.
У меня напоминалка с базой Paradox. Добавляю новую запись, делаю завершение сеанса пользователя, при этом программа запущена, загружаюсь запускаю программу записи нет. А если руками закрыть программу и сделать завершение сеанса пользователя. Все нормально.
Dmitrij_K (2005-12-29 13:07:00) [19]Тут помоему опечатка
должно быть так
protected
procedure IsWindowsShutDown(var Msg: TMessage); messageWM_ENDSESSION;
azl (2005-12-29 12:49:00) [20]Спасибо
protected procedure IsWindowsShutDown(var Msg: TMessage);WM_ENDSESSION;
Ругается на WM_ENDSESSION;
Пишет: Field definition not allowed after methods or properties
И, наверное, вместо MainForm.Close; Нужно писать Form1.Close; ?
Без WM_ENDSESSION; запускается.