2011-10-10 6 views
7

Sto usando Delphi 6 Pro. Ho bisogno di un evento che sparerà quando la mia applicazione si spegnerà definitivamente ma prima che tutti i moduli vengano distrutti. Ho pensato di intrappolare i messaggi WM_QUIT nel modulo principale WndProc(), ma questo non ha funzionato perché i moduli hanno iniziato a distruggere prima di vedere un messaggio WM_QUIT. Mi chiedevo se esiste un evento Delphi standard che posso utilizzare per eseguire codice a questo punto della catena di eventi di shutdown? Non è possibile utilizzare l'evento FormClose() della maschera principale poiché non è garantito l'attivazione e l'evento FormDestroy() è troppo tardi. Qualche idea?Esiste un evento Delphi che è garantito per essere chiamato quando un'app termina ma prima che tutti i moduli vengano distrutti?

risposta

14

Non vedrete un messsage WM_QUIT arrivano nel metodo WndProc(), come WM_QUIT è un segnale per il loop di messaggi per interrompere l'esecuzione, e come tale non è di solito spedito ad una routine di finestra.

Non c'è un evento specifico per quello che stai chiedendo. Quello che puoi fare, tuttavia, è aprire il file .dpr del tuo progetto e inserire il codice che ti serve dopo la chiamata alle uscite Application.Run. Il ciclo dei messaggi non è più in esecuzione, ma gli oggetti Application e MainForm non sono ancora stati liberati.

+0

Eccellente @Remy Lebeau. Non pensavo di usare il file di progetto. –

+1

L'unico problema con questo è che dopo Application.Run ha terminato tutto ha effettivamente chiuso e solo le sezioni di finalizzazione sono lasciati a correre. Questo è molto tardi nel pezzo - troppo tardi per fare qualsiasi lavoro efficace. – Misha

7

Il modo migliore per farlo (e ho passato molto tempo a guardarlo nel corso degli anni) è collegare una procedura tramite la routine AddTerminateProc() in SysUtils.pas. Funziona sempre e lo uso da anni (a meno che non si uccida il processo tramite il task manager).

+0

Grazie Misha. Lo farò anche io. –

Problemi correlati