[VB.NET 2005] - Chiusura Form

sabato 07 novembre 2009 - 12.32

petitmax Profilo | Newbie

Salve a tutti,

spero di aver beccato la "stanza" giusta dove postare questo 3D.

Quello in oggetto so bene che è, per i Guru della programmazione, argomento di bassissimo livello ma purtroppo a me sta dando un pò di problemi.
Da utente diligente (scusate la rima) ho cercato in giro nel Forum qualcosa di gia trattato, ma nessuno di questi mi ha aiutato a risolvere il problema che di seguito vi illustro:

quando l'utente chiude il Form ("X" in alto a destra del form stesso oppure premento ATL+F4) viene richiamato l'evento "FormClosing" all'interno del quale vado a scrivere in un log la fine delle operazioni...quindi il programma si chiude....e fin quì tutto ok.

Il problema sorge quando si verifica una particolare condizione nel qual caso chuido io "da codice" l'applicazione con lausilio dell'istruzione End.
In questo caso però l'evento "FormClosing" non viene richiamato e la scrittura nel log di fine applicazione viene saltata (essendo quest'ultima una porzione di codice implementata in quell'evento).

Come posso fare ?

Spero di essere stato chiaro.

Grazie.
Max

luigidibiasi Profilo | Guru

Quando usi end blocchi l'applicazione senza scatenare nessun altro evento.

Se guardi nelle proprietà del progetto puoi configurare la modalità di terminazione del programma:

" termina alla chiusura dell'ultimo form" oppure " termina alla chiusura del form di avvio"

Senza usare END puoi far terminare l'applicazione alla chiusura del form di avvio ( che dovrà rimanere attivo durante tutto il ciclo di vita dell'appliazione) e scrivere nell'evento form_closing di quest'ultimo il codice di salvataggio del log.
Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/
http://www.dibiasi.it/

petitmax Profilo | Newbie

Ciao luigi e grazie per la risposta.

>" termina alla chiusura dell'ultimo form" oppure " termina alla
>chiusura del form di avvio"
Nel mio progetto ho gia selezionato come modalità di arresto "Alla chiusura del form di avvio" che tra l'altro è gia selezionata "per default" alla creazione del progetto.

Come spiegavo nel mio primo post: l'applicazione si chiude correttamente (quindi scatena l'evento "Form_Closing") nel momento in cui l'utente chiude l'applicazione cliccando sulla "X" in alto a destra o con ALT+F4.

Può verificarsi un caso in cui (e intercetto questa eventualità) l'applicazione si avvia senza che appaia alcun form all'avvio e si chiude da sola senza che la "Form_Closing" venga scatenata.

Quindi la domanda è: come faccio a chiudere l'applicazione in maniera pulita ?

Grazie
Max

P.S.: chiedo scusa se non sono stato chiaro nell'esporre il problema

Teech Profilo | Expert

Se il log lo devi scrivere sia che si apra, sia che non si apra il form hai sbagliato a mettere il codice di gestione sul form...
Se hai una Sub Main che gestisce l'apertura o meno del form puoi mettere il codice di gestione in quel punto.
Un esempio non scritto in codice:

Sub Main 'Apri il log e scrivi qualcosa Dim fm As TuoForm If condizioneApertura Then fm.ShowDialog 'Scivi il log dopo la chiusura del form o se il form non si è aperto End Sub
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

petitmax Profilo | Newbie

Grazie per la risposta...e scusate se rispondo soltanto ora.

...e se non avessi una Sub Main ?
devo per forza utilizzarne una esclusivamente per il controllo dell'apertura/chiusura del Form (e relativa scrittura del log) ?

Io nel frattempo ho adottato questa soluzione...anche se non è "pulitissima":

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

In questo modo se "condizione" si verifica scateno, con la Dispose, l'evento Form.Closing.
Stesso discorso se l'utente chiude la form manualmente con la "X" in alto.

So che è un po "arrangiata" come soluzione...

Graditi commenti/critiche

Grazie
Max

Teech Profilo | Expert

>Grazie per la risposta...e scusate se rispondo soltanto ora.
>...e se non avessi una Sub Main ?
>devo per forza utilizzarne una esclusivamente per il controllo dell'apertura/chiusura del Form (e relativa scrittura del log) ?
Ho scritto 'Sub Main' per mettere qualcosa... Utilizzerai una Sub all'interno di una classe o di un modulo per leggere i tuoi file comunque...

>Io nel frattempo ho adottato questa soluzione...anche se non è "pulitissima":
>...
>In questo modo se "condizione" si verifica scateno, con la Dispose, l'evento Form.Closing.
>Stesso discorso se l'utente chiude la form manualmente con la "X" in alto.
>So che è un po "arrangiata" come soluzione...
>
>Graditi commenti/critiche
Se la condizione non viene soddisfatta apri un form per poi chiuderlo subito... Dalle mie parti si dice che fai 2 fatiche :-)... Non è meglio testare la condizione ed aprire il form solo se necessario? il log lo gestisci dalla subroutine chiamante...

>Grazie
Di nulla
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

petitmax Profilo | Newbie

>Se la condizione non viene soddisfatta apri un form per poi chiuderlo
>subito... Dalle mie parti si dice che fai 2 fatiche :-)
E chi se ne f****....pare che la fatica la faccio io..... eh eh :o) scherzo.

>... Non è meglio testare la condizione ed aprire il form solo se necessario?
>il log lo gestisci dalla subroutine chiamante...

Grazie ancora per il suggerimento.
Appena finito posso postare il codice con la soluzione così da commetarlo...???

Teech Profilo | Expert

Certo...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5