Newsgroup: it.comp.lang.delphi
Titolo: Problema in chiusura con LMDTrayIcon

Ciao a tutti,
sto sviluppando una piccola applicazione che mi spenga il pc ad un orario
determinato.
Per realizzarla ho utilizzato il componente LMDTrayIcon.
Questo programma crea una chiave nel registry per essere lanciato
all'accensione del sistema.
Il problema che riscontro è che quando cerco di disconnettermi dal sistema o
di riavviare il SO con il programmino attivo non riesco.
Se chiudo il programmino e riprovo, l'operazione va a buon fine.
Qualche idea ?
Grazie, Zano .
PS: Il programma utilizza un timer per fare il confronto dell'ora prefissata
con quella di spegnimento (sempre se può interessare).

 > Il problema che riscontro č che quando cerco di disconnettermi dal 
sistema o
 > di riavviare il SO con il programmino attivo non riesco.
cioč...?
cosa succede?
A

 cosa succede?
Cioè se l'applicazione è attiva e viene visualizzata l'icona nel traybar e
clicco su Start-Chiudi Sessione, il pc non tenta nemmeno di spegnersi.
Se chiudo l'applicazione e ripeto l'operazione di chiusura il sistema
operativo si chiude correttamente.
Da cosa può dipendere?

usi un timer, dicevi...
Quanto hai messo per interval?
A



Potrebbe essere dovuto dal fatto che in fase di shutdown
l'applicazione non gestisce correttamente WMQueryEndSession.
Mi spiego meglio: normalmente le applicazioni su traybar vengono
minimizzate anzichè chiuse quando si preme la bordericon "close".
Questo viene fatto semplicemente mettendo CanClose = false nell'evento
FormCloseQuery.
Utilizzando questo metodo però si ha il problema che in fase di
shutdown l'applicazione non termina e lo shutdown fallisce.
Problema che viene appunto risolto con la gestione del sopracitato
messaggio WMQueryEndSession.
Magari non centra nulla, ma è la prima cosa che mi viene in mente :)
Ciao.
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"

 messaggio WMQueryEndSession.
Esattamente!
Per far si che alla chiusura della finestra questa venisse solamente
nascosta
e non terminasse l'applicazione avevo messo il seguente codice:
...
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  CanClose = false;
  Hide();
  ....
}
...
Allora ho pensato di mettere un'altra form come principale: quando chiudo la
form ex-principale viene nascosta (come volevo), ma non causa la chiusura
dell'applicazione; invece quando viene ricevuto il messaggio di chiusura
dell'applicazione da parte del sistema operativo la nuova form principale
non impedisce la chiusura.
Si poteva fare in modo diverso ?
Grazie.
Zano.

 Si poteva fare in modo diverso ?
Si', ad esempio:
type TForm1 = class(TForm)
...
private
  fCanClose: boolean;
  procedure wmQueryEndSession(...); message WM_QUERYENDSESSION;
...
nella wmQueryEndSession setti fCanClose a true; 
nella OnCloseQuery CanClose := fCanClose;
Saluti
Paolo Arosio
-- 
"La dimostrazione dell'esistenza di specie intelligenti nell'universo
 e' che non ci vengono a trovare"

Si poteva fare in modo diverso ?
No, il sistema è giusto. Basta seguire i consigli che ti ha dato
Paolo.
Aggiungo solo una cosa:
procedure TMainForm.WMQueryEndSession(var msg: TWMQueryEndSession);
begin
  CanCloseWin := True;
  Msg.Result := 1;
  ^^^^^^^^^^^^^^^^^Importante!
end;


Grande Paolo: questa è una soluzione molto elegante e pulita, imho. :))
A