Newsgroup: it.comp.lang.visual-basic
Titolo: Ciclo di vita dei form

Ciao a tutti.
Piu' traffico qua sopra (VB6), e piu' mi rendo conto di avere ancora delle
grosse lacune.
Prendiamo un form (frm1), ci si mette sopra un bel command e sul click del
cmd1, scriviamo:
frm2.Show
il secondo form viene caricato, viene mostrato e naturalmente vengono
eseguiti i vari eventi load, activate ecc. del frm2
Diciamo che nell'evento Load del frm2, abbiamo messo un Y ="Ciao" , dopo
aver dichiarato nella sezione dichiarazioni del form:
Dim Y as String ' quindi variabile privata all'interno del frm2, non e'
statica e non ci sono variabili globali!
Clicchiamo sulla X bianca a sfondo rosso che serve per chiudere un form,
il frm2 comincia la sua procedurina di chiusura, QueryUnload, Unload ecc.
e ci ritroviamo sul nostro form principale.
Se metto in pausa l'esecuzione, vado sulla finestra immediata, scrivo:
  ? frm2.Y
la risposta e':
  Ciao
????????
Ma come, una volta eseguito l'unload di un form, non vengono rilasciate le
risorse, distrutte le variabili ecc?
Stavo facendo delle prove su un'applicazione, mi ero reso conto che i
valori di alcune variabili restavano in memoria anche dopo aver chiuso i
form che le contenevano. Dove e' che sto sbagliando (tanto lo so che sto
sbagliando io)?
Perche' non vengono rilasciate le risorse che non sto piu' utilizando?
Grazie... Maurizio
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio
news:dempp5$6nu$1...@news.newsland.it...

Perché quando richiami un form con il suo nome l'istanza è una sola, quella
"implicita", ed è globale.
Il metodo Unload (o la chiusura con la "X") fa sì che venga scaricata la "parte
visuale" dell'istanza stessa, ma le variabili di modulo rimangono al valore
ultimo.
Per realizzare quello che intendi tu occorre distruggere esplicitamente questa
istanza implicita, solo così hai la certezza che le sue variabili di modulo
partano dai valori predefiniti.
    frm2.Show vbModal    ' Qui avvengono una creazione ed un Load impliciti
    Set frm2 = Nothing
Oppure, ancora meglio creare esplicitamente una nuova istanza del form
secondario, in modo da avere il controllo totale del ciclo di vita del form (per
semplicità supponiamo che Y sia dichiarata con Public e non Dim in frm2):
Sub cmd1_Click()
Dim frm As frm2
    Set frm = New frm2    ' Crea la nuova istanza esplicitamente
    Debug.Print frm.Y        ' <- Sarà sempre ""
    frm.Show vbModal
    Debug.Print frm.Y       ' <- Sarà ancora "ciao"
    Set frm = Nothing       '  Distrugge l'istanza
    Debug.Print frm.Y       ' Errore: object variable not set
End Sub
Bye
Raf

 valore ultimo.
La cosa è simpaticissima se si realizza un servizio NT con abilitazione 
all'interattività (e quindi con form visibile all'utente in shell).
Al logout dell'utente da shell, avviene il queryunload e unload della 
form, ma tutte le risorse vive su di essa (compresi, ad esempio, i 
timer) restano attive e perfettamente funzionanti.
Ciao
Alberto
-- 
Autore di
"Petting for Dummies"

     Set frm2 = Nothing
...
Problema...
Nel caso in cui il Form frm2 venga chiamato come modale, cio' non
costituisce un problema, si puo' distruggere il form semplicemente
mettendo le istruzioni dopo la chiamata del form frm2.
Nel caso di un form non modale, il codice non si arresterebbe alla
chiamata del frm2, ma andrebbe avanti. Come poter fare per distruggere il
form?
Non sarebbe possibile utilizzare in qualche modo, l'evento Unload del form
stesso?
Ciao... Maurizio


 Ciao... Maurizio
Ciao
Raf

 di frm2 scrivi Set frm2 = Nothing pare che funzioni!
Solo che da dentro ad una classe (come il form) non puoi essere sicuro del
nome della variabile usata.
Ciao
--
Reporting tool: 
http://www.neodatatype.net

 nome della variabile usata.
Quello che non puoi sapere è se l'istanza del form in fase di Unload è quella
predefinita o una nuova.
Anzi, volendo con un test si potrebbe anche sapere:
If Me Is frm2 Then
    Set frm2 = Nothing
End If
Ma comunque, se ho ben capito, l'intenzione è quella di usare *solo* l'istanza
predefinita, quella che si chiama come la classe (form).
Ogni altra eventuale istanza creata esplicitamente deve essere rilasciata
altrettanto esplicitamente con Set ... = Nothing.
Bye
Raf

 di frm2 scrivi Set frm2 = Nothing pare che funzioni!
...
Mah, io non ci avevo neanche provato, pero' l'ho pensato.
Poi mi sono anche detto... come faccio a distruggere una cosa, dalla cosa
stessa, e con del codice in esecuzione. Un'autodistruzione da panico,
meglio lasciar perdere.
E invece...!!!!


 E invece...!!!!
E invece occhio a quello che fai ;)


 E invece occhio a quello che fai ;)
...
Vabbe', dato per scontato che il pc non esplode, l'FBI non dovrebbero
occuparsi troppo della cosa, e il mio conto in banca resta invariato
(tanto non potrebbe far altro che crescere, visto come e' messo), cosa
intendi dire?


 Ciao... Maurizio
Ciao
Raf

 in modo del tutto particolare l'istanza predefinita, magari filerà tutto
liscio.
...
Beh, lo sapevo gia' e' una parola un po' grossa, cmq. immaginavo che
qualche cosa di poco carino potesse succedere.


 essere fonte di casini...
No, intendevo dire che le soluzioni "se usata cosě sta in piedi" sono a mio
avviso una "bed practice".
Oggi va, domani gli cambi scenario in un modo che non dovrebbe influire e ti
ritrovi a fare inutili ore di debug (ovviamente *dopo* che *qualcun altro*
ha trovato il problema).


 avviso una "bed practice".
Scritta così suona molto più divertente di quanto non sia in realtà... ;)
Bye

 Scritta così suona molto più divertente di quanto non sia in realtà... ;)
:P

 Scritta così suona molto più divertente di quanto non sia in realtà... ;)
Dev'essere un lapsus froidiano da astinenza :P
Ciao

 Dev'essere un lapsus froidiano da astinenza :P
O più semplicemente sto scrivendo come mangio... :(
Ciao

 O più semplicemente sto scrivendo come mangio... :(
sei a dieta? :PP