Форма не обрабатывает события (процедуры) Close, CloseQuery!

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Kire313evz
новенький
Сообщения: 11
Зарегистрирован: 27.03.2010 11:59:06

Форма не обрабатывает события (процедуры) Close, CloseQuery!

Сообщение Kire313evz »

Друзья подскажите!
Форма не обрабатывает события (процедуры) Close, CloseQuery в том случае если приложение активно и вызвать завершение работы windows.
Так же, организовал перехват системного сообщения WM_QUERYENDSESSION:

private
procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;


procedure TFormMain.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
inherited;
...
end;

И эта процедура не выполняется! Не пойму в чём дело! :(
Спасибо за помощь!
Kire313evz
новенький
Сообщения: 11
Зарегистрирован: 27.03.2010 11:59:06

Сообщение Kire313evz »

Ну что, никто проверить не может, так у всех или нет! Бывалые в лазарусе подскажите!!!!! :( :( :(
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

У меня OnExit не отрабатывает.
Kire313evz
новенький
Сообщения: 11
Зарегистрирован: 27.03.2010 11:59:06

Сообщение Kire313evz »

sign писал(а):У меня OnExit не отрабатывает.

Извини, а что такое событие есть у формы? Я не нашёл!

Добавлено спустя 1 минуту 49 секунд:
Может быть, у Lazarus, заведено отдельное событие на выключение системы???
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

У формы нет, есть у компонентов разных и визуальных.
Kire313evz
новенький
Сообщения: 11
Зарегистрирован: 27.03.2010 11:59:06

Сообщение Kire313evz »

Не, ребята помогите реализовать обработчик, который реагировал на закрытие системы!!!!!!!
eevee
новенький
Сообщения: 63
Зарегистрирован: 29.12.2009 16:52:44
Откуда: Саратов

Сообщение eevee »

Присоединяюсь к просьбе :) У меня так и не получилось отловить завершение заботы...

P.S. Вопрос в теме немного неправильный... Close и CloseQuery работают отлично, но они вызываются только тогда, когда Вы сами закрываете программу нормальным способом. Если она убивается сторонним приложением, то должно обрабатываться OnEndCloseSession и иже с ними. Но они нифига не обрабатывают.... Тут, как говорится, либо лыжи не едут, либо .................
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Код: Выделить всё

Unit Unit1; 

{$mode objfpc}{$H+}

Interface

Uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs;

Type

  { TForm1 }

  TForm1 = Class(TForm)
    Procedure FormCreate(Sender: TObject);
  Private
    { Private declarations }
    Procedure AppEndSession(Sender: TObject);
  Public
    { Public declarations }
  End;

Var
  Form1: TForm1;

Implementation

{$R *.lfm}

{ TForm1 }

Procedure TForm1.FormCreate(Sender: TObject);
Begin
  Application.OnEndSession := @AppEndSession;
end;

Procedure TForm1.AppEndSession(Sender: TObject);
Var
  aList: TStringList;
Begin
  aList := TStringList.Create;
  aList.Add('Hello');
  aList.SaveToFile('C:\develop\1.txt');
  aList.Free;
End;

End.

После выходу из системы с запущенным приложением обнаруживаю в означенной папке файлик... На линуксе пока не проверить
Kire313evz
новенький
Сообщения: 11
Зарегистрирован: 27.03.2010 11:59:06

Сообщение Kire313evz »

Хорошо, проверим! Спасибо!

Добавлено спустя 2 часа 20 минут 17 секунд:
Да, в windows работает!!! Brainenjii, огромное спасибо!!! Спасибо всем!
karlson
незнакомец
Сообщения: 2
Зарегистрирован: 15.01.2011 11:42:38

Сообщение karlson »

Огромное спасибо
WM_QUERYENDSESSION удалось обойти, а как быть с WM_POWERBROADCAST?
Тоже не отрабатывает, возможно по той же причине что и WM_QUERYENDSESSION.
Оно необходимо для запрещения (или подготовки) перехода компьютера в спящий режим.
Может есть какой-нибудь другой способ?

Заранее благодарен за любую помощь.
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Тут написано как правильно ловить WM_XXX сообщения в LCL-приложениях:
http://wiki.lazarus.freepascal.org/Win3 ... our_window
karlson
незнакомец
Сообщения: 2
Зарегистрирован: 15.01.2011 11:42:38

Сообщение karlson »

Вроде работает, спасибо,
но теряется сообщение WM_POWERBROADCAST с параметром PBT_APMQUERYSUSPEND = $0000 и PBT_APMQUERYSTANDBY = $0001, т.е. как раз те самые на которые можно ответить чтобы не переходить в спящий режим.
т.е. приходят остальные:
PBT_APMSUSPEND = $0004;
PBT_APMRESUMESUSPEND = $0007;
PBT_APMRESUMEAUTOMATIC = $0012;

Стоит цель не пустить в спящий и аналогичные режимы.
Ответить