Newsgroup: it.comp.lang.delphi
Titolo: differanza tra chiusura del programma e arresto del sistema?

ho creato la seguente procedura .
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
      if MessageDlg('Sei Sicuro di Chiudere?', mtConfirmation,
      [mbOk, mbCancel], 0) = mrCancel then
        CanClose := False;
end;
finche chiudo il programma a mano tutto funziona bene. Lui mi fa la domanda
se voglio uscire o no.
I problemi iniziano se io do l'ordine a windows di chiudersi col programma
aperto.
Windows non si chiude finchè io non chiudo manualmente il programma.
Avete qualche idea su come possa fare aggirare il problema ?
Grazie

Devi intercettare tutti e due oppure uno tra questi: Wm_EndSession e Wm_QueryEndSession
Wm_EndSession è inviato dopo che Window ha processato il messaggio Wm_QueryEndSession
Wm_QueryEndSession è inviato alla chiamata dell'API ExitWindows
quindi
Procedure TForm1.WmQueryEndSession(Var Msg : TMessage);
Begin
  Msg.Result     := Ord(True);
  Puoi_Chiudere  := True;
End;
Procedure TForm1.WmEndSession(Var Msg : TMessage);
Begin
  Msg.Result     := 0;
  Puoi_Chiudere  := True;
  Close;
End;
Puoi_Chiudere è globale ed inizializzato a false, la tua procedura diventerà:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
    if Puoi_Chiudere Then
    begin
        CanClose := True;
    end
       else
      if MessageDlg('Sei Sicuro di Chiudere?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then  CanClose := False;
end;
Se proprio vuoi fare le cose in grande intercetta anche il messaggio WM_PowerBroadcast che è inviato in caso di fine
batterie e scrivi la procedura come WM_EndSession
Ciao,
David (
www.utilityweb.net
)

       if MessageDlg('Sei Sicuro di Chiudere?', mtConfirmation, [mbOk,
mbCancel], 0) = mrCancel then  CanClose := False;
odio la prolissita' :)
CanClose:=Puoi_Chiudere or (not Puoi_Chiudere and (MessageDlg('Sei Sicuro di
Chiudere?', mtConfirmation, [mbOk, mbCancel], 0)=mrOk));
Ciao, Sandro

> odio la prolissita' :)
A vantaggio dell'illeggibilità...

 Chiudere?', mtConfirmation, [mbOk, mbCancel], 0)=mrOk));
Se č settata come opzione di compilazione "Complete boolean eval" e Puoi_Chiudere č true mostra comunque il messaggio a
video
--
Ciao,
David (
www.utilityweb.net
)

 video
vero, vero :) ma io non ho mai messo, non metto e non mettero' mai la spunta
"Complete boolean eval"!!
Ciao, Sandro

 Se è settata come opzione di compilazione "Complete boolean eval" e
Puoi_Chiudere è true mostra comunque il messaggio a


Prova cosě:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
     Puoi_Chiudere:boolean;
     procedure WMQueryEndSession (var Msg : TWMQueryEndSession); message
WM_QueryEndSession;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMQueryEndSession(var Msg : TWMQueryEndSession);
begin
  Msg.Result     := 1;  //1 chiude, 0 non chiude
  Puoi_Chiudere  := True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Puoi_Chiudere:= false;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if Puoi_Chiudere then
    CanClose := True
  else if MessageDlg('Sei Sicuro di Chiudere?', mtConfirmation, [mbOk,
mbCancel], 0) = mrCancel then
    CanClose := False;
end;
Ciao
Andrea

 ha scritto nel messaggio
news:a1QUb.18465$Mt6.6...@twister2.libero.it...


 Mirko
Esatto