Hallo,
es soll so sein, dass erst nach der Eingabe eines Passwortes Windows runterfahren soll.
Wenn ich die Procedure:
procedure WMQÚERYENDSESSION (var msg: TMessage); message WM_QUERYENDSESSION;
innerhalb von TForm deklariere wird sie auch ausgelöst und es funktioniert wie es soll.
z.B.:
Delphi-Quellcode:
type
TfrmCPTestProgramm = class(TForm)
TrayIcon1: TTrayIcon;
PopupMenu1: TPopupMenu;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Beenden1Click(Sender: TObject);
private
// -----------------------------------------------------------------------------
procedure WMQÚERYENDSESSION (var msg: TMessage); message WM_QUERYENDSESSION;
// -----------------------------------------------------------------------------
procedure ONWinEnde(Sender : TObject; var canWinClose: boolean);
public
prg_ende: Boolean;
WinClose: TWinEndeClass;
end;
implementation
{$R *.dfm}
procedure TfrmCPTestProgramm.FormCreate(Sender: TObject);
begin
WinClose:= TWinEndeClass.Create(self);
WinClose.ONWinCloseQuery := ONWinEnde;
Prg_Ende:= FALSE;
TrayIcon1.Visible:= True;
end;
procedure TfrmCPTestProgramm.ONWinEnde(Sender : TObject; var canWinClose: boolean);
var
r: Integer;
begin
r:= MessageBox(0,'Runterfahren ','Achtung ich will runterfahren ',MB_YESNO);
if r= IDYES then
begin
ShowMessage (' ONWinEnde Das Programm wird runtergefahren');
canWinClose:= TRUE;
end
else
begin
ShowMessage ('ONWinEnde Das Programm wird nicht runtergefahren');
canWinClose:= FALSE;
end;
end;
procedure TfrmCPTestProgramm.WMQÚERYENDSESSION(var msg: TMessage);
var
test: Boolean;
begin
if msg.msg = WM_QUERYENDSESSION then
begin
if Assigned(WinClose.FONWinCloseQuery) then
begin
WinClose.FONWinCloseQuery(self, Test);
end;
end;
if Test then
begin
msg.RESULT:= integer(TRUE);
end else
begin
msg.RESULT:= integer(FALSE);
end;
end;
allerdings wenn man die Procedure in eine Klasse unterbringt wird das Event nicht ausgelöst.
z.B.:
Delphi-Quellcode:
type
TWinCloseQueryEvent = procedure(Sender: TObject; var WinCanClose: Boolean) of object;
TWinEndeClass = class(TControl)
private
FONWinCloseQuery: TWinCloseQueryEvent;
procedure WMQÚERYENDSESSION (var msg: TMessage); message WM_QUERYENDSESSION;
public
constructor Create (Owner: TComponent); override;
destructor Destroy; override;
property ONWinCloseQuery: TWinCloseQueryEvent read FONWinCloseQuery write FONWinCloseQuery;
end;
{ TWinEndeClass }
constructor TWinEndeClass.Create(Owner: TComponent);
begin
inherited Create (Owner);
end;
destructor TWinEndeClass.Destroy;
begin
inherited Destroy;
end;
procedure TWinEndeClass.WMQÚERYENDSESSION(var msg: TMessage);
var
test: Boolean;
begin
if msg.msg = WM_QUERYENDSESSION then
begin
if Assigned(FONWinCloseQuery) then
begin
FONWinCloseQuery(self, Test);
end;
end;
if Test then
begin
msg.RESULT:= integer(TRUE);
end else
begin
msg.RESULT:= integer(FALSE);
end;
end;
Kann mir jemand sagen, warum das Event innerhalb einer Klasse nicht verarbeitet werden kann?
Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.