Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обработать выключение компьютера? Моя прога не дает компьютеру выключиться 
:(
    Опции темы
E_v_g
Дата 24.1.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



При выключении компьютера завершаются все программы, а моя программа становится активной и комп не вырубается. При закрытии программы пользователем или при завершении работы ОС она должна сохранить настройки. Как это корректно реализовать?
Код

    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
    procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
    procedure WMEndSession(var Message: TWMEndSession); message WM_ENDSESSION;

Код

// вызывается при закрытии формы пользователем и при завершении Windows
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  SaveSettings;
  CanClose := true; // true - значит, можно закрыть
end;

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
  inherited;
  Message.Result := 1; // если <> 0, то Windows можно завершить
end;

procedure TForm1.WMEndSession(var Message: TWMEndSession);
begin
  inherited;
  Message.Result := 1; // если <> 0, то Windows можно завершить
end;

PM ICQ   Вверх
MetalFan
Дата 24.1.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



настройки чтоли долго сохраняются?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
E_v_g
Дата 25.1.2008, 11:29 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



Неа, быстро сохраняются. Короче, я ее победил - поставил Halt в каждом обработчике и все заработало как надо. Вроде бы...  smile 
PM ICQ   Вверх
MetalFan
Дата 25.1.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



сохраняй настройки в OnDestroy главной формы


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
E_v_g
Дата 26.1.2008, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



Пробовал - при первой попытке выйти из Windows программа гаснет, Windows не завершается, требуется вторая попытка.
PM ICQ   Вверх
MetalFan
Дата 26.1.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



ерунда какаято.
что происходит во время сохранения опций?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
E_v_g
Дата 28.1.2008, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



Вот сохранение:
Код

procedure TForm1.SaveSettings;
var
  i : integer;
begin
  Memo2.Clear;
  Memo1.Clear;
  Memo3.Clear;
  Memo5.Clear;
  if CheckBox6.Checked then // если галочка на "сохранять", то
    begin
      // сохранить все данные формы
      WriteComponentResFile(fil, Self);
      Memo1.Clear;
      Memo1.Lines.Add('');
      // занести в Memo1 строки, отмеченные в трех CheckListBox-ах 
      for i := 0 to CheckListBox1.Items.Count - 1 do
        if CheckListBox1.Checked[i] then
          Memo1.Lines.Strings[0] := Memo1.Lines.Strings[0] + '1'
        else
          Memo1.Lines.Strings[0] := Memo1.Lines.Strings[0] + '0';
      Memo1.Lines.Add('');
      for i := 0 to CheckListBox2.Items.Count - 1 do
        if CheckListBox2.Checked[i] then
          Memo1.Lines.Strings[1] := Memo1.Lines.Strings[1] + '1'
        else
          Memo1.Lines.Strings[1] := Memo1.Lines.Strings[1] + '0';
      Memo1.Lines.Add('');
      for i := 0 to CheckListBox3.Items.Count - 1 do
        if CheckListBox3.Checked[i] then
          Memo1.Lines.Strings[2] := Memo1.Lines.Strings[2] + '1'
        else
          Memo1.Lines.Strings[2] := Memo1.Lines.Strings[2] + '0';
      Memo1.Lines.SaveToFile(fil1);
    end
end;

Кроме того, на форме есть WebBrowser и штук 5 Timer-ов, может, в них дело?
PM ICQ   Вверх
MetalFan
Дата 28.1.2008, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(E_v_g @  28.1.2008,  06:02 Найти цитируемый пост)
Вот сохранение:

корявенько, но вроде без криминала...

Цитата(E_v_g @  28.1.2008,  06:02 Найти цитируемый пост)
Кроме того, на форме есть WebBrowser и штук 5 Timer-ов, может, в них дело? 

таймеры... может их вырубить стоит в CloseQuery?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
EvilsInterrupt
Дата 30.1.2008, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 1
Всего: 9



MetalFan,  не может, а нужно!
PM MAIL WWW ICQ Jabber   Вверх
E_v_g
Дата 31.1.2008, 05:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



Убрал все это:
Код

 procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
 procedure WMEndSession(var Message: TWMEndSession); message WM_ENDSESSION;

Переписал завершение в OnDestroy:
Код

procedure TForm1.FormDestroy(Sender: TObject);
var
  i : integer;
begin
  Memo2.Clear;
  Memo1.Clear;
  Memo3.Clear;
  Memo5.Clear;
  Timer1.Free;
  Timer2.Free;
  Timer3.Free;
//  Timer4.Enabled := false;
  if CheckBox6.Checked then
    begin
      WriteComponentResFile(fil, Self);
      ............................
      Memo1.Lines.SaveToFile(fil1);
    end;
  inherited
end;


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

Таймеры все убил smile

Это сообщение отредактировал(а) E_v_g - 31.1.2008, 05:49
PM ICQ   Вверх
E_v_g
Дата 31.1.2008, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



Ладно, мастера, спасибо, не ломайте голову, пока устраивает и так:
Цитата(E_v_g @  25.1.2008,  11:29 Найти цитируемый пост)
поставил Halt в каждом обработчике и все заработало как надо

(на этом же форуме натолкнулся на эту мысль)
PM ICQ   Вверх
simsmann
Дата 17.2.2008, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 26.11.2006

Репутация: нет
Всего: нет



Вопрос поставлен давно, но до сих пор на него нет ответа!!!
Этот вопрос ставился на многих форумах, есть статьи но ничего не дает результата!!!
Вот некоторые ссылки

http://valler.narod.ru/master/ShutDown.html
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=57161
http://delphiworld.narod.ru/_app_.html

В том числе и на этом форуме вот тема поднималась в общих вопросах

http://forum.vingrad.ru/forum/topic-70589.html#st_0_view_0

Как правило трудности у тех программ которые помещают икону в систем трей.
Обработка WMQueryEndSession и WMEndSession ничего не дает, если даже программа на выходе ничего не сохраняет, все равно программа выгружается если обработать WMQueryEndSession и WMEndSession, а винда затормозилась и продолжает работать какбудто команды на выключение не было.

Кто решил данную проблема ОТКЛИКНИТЕСЬ!!! 

PM MAIL   Вверх
dumb
Дата 18.2.2008, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(simsmann @  17.2.2008,  20:14 Найти цитируемый пост)
Вопрос поставлен давно, но до сих пор на него нет ответа!!!
какой вопрос? куда поставлен?!

Цитата(simsmann @  17.2.2008,  20:14 Найти цитируемый пост)
а винда затормозилась и продолжает работать какбудто команды на выключение не было

в обработчике WM_QUERYENDSESSION вернуть TRUE, в обработчике WM_ENDSESSION вернуть 0, завершить выполнение программы.


PM MAIL   Вверх
simsmann
Дата 18.2.2008, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 26.11.2006

Репутация: нет
Всего: нет



dump не надо грязи!   smile 

E v q четко поставил вопрос. Внимательно изучи вопрос потом давай советы.
E v q представил код 
Код

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
  inherited;
  Message.Result := 1; // если <> 0, то Windows можно завершить
end;

procedure TForm1.WMEndSession(var Message: TWMEndSession);
begin
  inherited;
  Message.Result := 1; // если <> 0, то Windows можно завершить
end;


Message.Result := 1;  это тоже самое, что и TRUE

Цитата

в обработчике WM_QUERYENDSESSION вернуть TRUE, в обработчике WM_ENDSESSION вернуть 0, завершить выполнение программы.

Кстати 0 в WMEndSession запрещает завершение Виндов, точнее говорит о том, что прога не готова к завершению.
WMQueryEndSession отличается от WMEndSession только тем, что это первое и второе опевещение программ о завершении Виндов.
Цитата

какой вопрос? куда поставлен?!


А такой вопрос!!! Винда не завершается, как правило если вы помещаете икону программы в систем трей, там где часы и убираете отображение кнопки программы на панели задач. Причем не важно используете вы компоненты для этой цели (опробовал несколько) или своими ручками помещаете икону в систем трей.
И ставьте хоть сто раз в обработчиках WMEndSession и WMQueryEndSession :=TRUE или целое значение отличное от нуля, это значение тоже дает ОС сообщение, что программа готова к завершению Виндов (0 запрещает выгрузку ОС говоря, что окно не готово закрыться)

Самое интересное то, что при исследовании выяснилось, что ВИНДА второй раз(вначале опрашивается WMQueryEndSession, а потом если окна не готовы второй раз WMEndSession) не посылает сообщение. И проблема здесь наверно в том, что программа при помещении значка в систем трей сидит именно в процессах.
Закрытие программы  методом Close, Application.Terminate и выставление TRUE ничего не дает в обработчике WMQueryEndSession программа выгружается, а ВИНДА прекращает и WMEndSession не вызывается. Если все поставить в WMEndSession или туда и сюда тоже самое.
Прошерстил все форумы, данный ворос встречается часто, но ответа НЕТ!
Но слава БОГУ! и Винграду на котором всетаки нарисовался ответ. smile 
смотрите мой ответ по аналогичному вопросу, но в разделе общие вопросы.
Вот ссылка:
http://forum.vingrad.ru/forum/topic-70589/...1417174/15.html smile 



PM MAIL   Вверх
MetalFan
  Дата 18.2.2008, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(simsmann @  18.2.2008,  21:11 Найти цитируемый пост)
Кстати 0 в WMEndSession запрещает завершение Виндов, точнее говорит о том, что прога не готова к завершению.

неправда!
Цитата(MSDN)
WM_ENDSESSION Message
...
Return Value
If an application processes this message, it should return zero.



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.