Newsgroup: it.comp.lang.delphi
Titolo: Salvataggio prima dello shoutdown

Salve, ho un'applicazione che è sempre in funzione in una macchina, vorrei 
che quando si fa lo shoutdown di windows, la mia applicazione prima che 
venga interrotta mi faccia l'ultima operazione di salvataggio (una funzione 
salva).
Avevo pensato di fare così:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 salva;
end;
faccio bene? Se si CanClose dovrei impostarlo a FALSE prima di eseguire il 
tutto?
Ringrazio in anticipo quanti risponderanno!

 end;
..ma oltre a PENSARE, questa cosa l'hai provata o no?
A.

 ..ma oltre a PENSARE, questa cosa l'hai provata o no?
Certo che ho provato prima, funziona, ma non so se faccio bene.. cioč č la 
soluzione giusta o č una procedura instabile?
Se ti č capitato di gestire una cosa simile, come hai risolto?
Ti ringrazio in anticipo! 

 Se ti è capitato di gestire una cosa simile, come hai risolto?
Hai fatto tutto giusto.
Se imposti Canclose a False, impedisci a windows di chiudersi! Canclose 
serve proprio per impedire che l'applicazione continui la chiusura.Si 
usa per casi critici.
Quindi, lascia canclose così com'è.
Ciao
-- 
Morde

 Quindi, lascia canclose così com'è.
Aggiungo un paio di info per amor di precisione:
1. CanClose è un msg. generico che serve ad confermare/evitare la
chiusura di una form. Quindi, a rigore, non è direttamente associato
all'evento di windows shutdown o close session. Infatti viene invocato
anche alla chiusura dell'applicazione o semplicemente del form
dell'applicazione (per un'applicazione MDI).
Sarebbe quindi meglio intercettare il msg. esplicito lanciato da
WindoZe (ammesso che usi WindoZe e non Linux). L'esempio lo trovi qui:
http://delphi.about.com/cs/adptips2000/a/bltip0500_4.htm
2. Siccome CanClose viene passato come var e all'esterno ha l'effetto
di modificare il flusso del programma, sarebbe buona norma settarlo
esplicitamente prima di uscire dal metodo. Sono finezze, ma aiutano in
progetti grandi e con più sviluppatori:
  procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose:
Boolean);
  begin
    salva;
    CanClose := True;
  end;
3. Che cosa fai se la 'Salva' fallisce? Una soluzione può essere:
  procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose:
Boolean);
  begin
    try
      salva;
      CanClose := True;
    except
      // on error abort the form closing
      on e: Exception do begin
        ShowMessage(e.Message);
        CanClose := False;
      end;
  end;
4. Concordo con Morde che interrompere la chiusura di WindoZe va fatto
solo in casi estremi. Quindi sia che tu usi CloseQuery o
WM_QueryEndSession dovresti prevedere una chiusura automatica. Per
esempio: mostri un messaggio di conferma con un timeout di X secondi:
'Salvare? Se non si salva le modifiche saranno perse! Oppure nel tuo
caso Salvi e se fallisci scrivi la cosa in un log che mostri al
riavvio dell'applicazione la volta successiva.
5. La 4 la farei solo se il programma te lo pagano bene :-)
Gianpiero

 5. La 4 la farei solo se il programma te lo pagano bene :-)
Per un cliente ho proprio dovuto modificare un programma per gestire il 
shutdown intercettando WM_QueryEndSession. Diversamente, windows non si 
chiudeva. Questo e' successo perchè l'utility in questione, pensata per 
essere eseguita manulamente, e' stata poi messa in autostart.. ed ecco 
che il server programmato per riavviarsi ogni notte ha sollevato il 
problema.
Tutto questo lo dico per evidenziare come a volte certi problemi 
emergono perchè il cliente decide di modificare l'utilizzo di un 
software e purtroppo non tutto può essere previsto dal programmatore..
ciao
-- 
Morde

 
http://delphi.about.com/cs/adptips2000/a/bltip0500_4.htm
Grazie mille a te e a tutti!!