Newsgroup: it.comp.lang.visual-basic
Titolo: Variabili a livello di modulo

Salve NG,
vi sottopongo un quesito che per voi esperti sarà forse banale, ma io non
trovo una spiegazione:
uso VB6 SP5 ed ho una variabile a livello di modulo (form) del tipo
Option Explicit
Dim PicDaSalvare as Boolean
Durante l'esecuzione del form la variabile può diventare o meno True a
seconda degli eventi, solo che ho notato che, se la variabile diventa True,
in seguito, anche dopo aver scaricato il form (Unload Me) ed averlo
ricaricato (.Show), la variabile rimane True! Ho perso un bel po' di tempo a
cercare il bug, in quanto davo per scontato che all'atto
dell'inizializzazione di una variabile Boolean questa venisse settata False
di default. Ho allora inserito un'istruzione PicDaSalvare=False  nell'evento
Form_Load e tutto è andato a posto, ma mi rimane il dubbio: perché una tale
variabile si comporta a mò di Static?
A voi la risposta
Ciao!!

 variabile si comporta a mò di Static?
Perche':
1) carichi l'istanza predefinita del form;
2) il form non passa dal Terminate;
Provo a spiegarmi meglio.
Nel progetto hai un form che si chiama frmTest che contiene la
variabile PicDaSalvare.
Nel codice esegui qualcosa tipo questo:
Load frmTest	---> PicDaSalvare e' FALSE
frmTest.Show
' in qualche evento_
PicDaSalvare = True	---> PicDaSalvare e' diventato TRUE
Unload frmTest	---> PicDaSalvare *rimane* TRUE
' se passasse dal Terminate (cioe' mettendo frmTest a Nothing
' non so bene in quale evento) allora diventerebbe FALSE
e poi ancora:
Load frmTest	-
in questo caso ti riprendi PicDaSalvare nello stato dell'
ultima volta perche' l'istanza e' la stessa e non e' stata
ancora eliminata perche' non e' uscita dallo scope, in
quanto frmTest e' una istanza *globale* !
Invece, se chiamassi *una istanza* locale di frmTest cio' non accadrebbe:
Dim f As frmTest
Set f = New frmTest
quando f esce dallo scope l'istanza viene eliminata!
In pratica non si tratta di un bug di visual basic, ma di
una gestione non idonea delle istanze del form in relazione
allo scope: l'istganza predefinita del form e' globale
in visual basic e non viene distrutta fino al termine
dell'applicazione se non ci pensa il programmatore.
Viceversa, se dichiari una variabile locale come
nuova *istanza* del form allora all'uscita dallo scope
tale istanza (se scaricata) viene distrutta e non e'
piu' accessibile da nessuna parte del codice.
-- 
hth, hal

Azzolina, sei stato molto chiaro, ero sicuro che non fosse un bug, solo una
cosa vorrei capire a questo punto:
visto tutto ciò, conviene usare l'approccio di cui parli (dim f as frm
ecc.ecc.) perché l'approccio classico (senza terminare il form) può portare
ad altri problemi o è solo una questione di variabili che conservano il
proprio valore? Probabilmente ci sarà anche un maggior consumo di
memoria...?
Ciao e grazie per l'esauriente risposta

 ha scritto nel messaggio
news:okuzd.57613$C94....@tornado.fastwebnet.it...

Non ci sono controindicazioni particolari all'approccio "locale", in genere
solo vantaggi (specie se "piloti" le tue finestre tramite classi) e il
consumo di memoria e' minimo, dato che sostanzialmente crei solo un
puntatore in piu' (32 bit)
D'altra parte, per il problema specifico non e' strettamente necessario
abbandonare l'approccio classico; se rileggi bene una frase di hal
"l'istanza predefinita del form e' globale in visual basic e non viene
distrutta fino al termine dell'applicazione *se non ci pensa il
programmatore*."
c'e' indicata un'altra soluzione, ovvero semplicemente distuggere l'istanza
globale usando 'Set TuaForm = Nothing' dopo averla scaricata.
Nota che non e' necessario reistanziarla con 'New' negli accessi successivi,
perche' a creare l'istanza predefinita pensa VB
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 ha scritto nel messaggio
news:4Rwzd.57694$C94....@tornado.fastwebnet.it...


 Ciao!
Ciao,
Andrea