Newsgroup: it.comp.lang.visual-basic
Titolo: [?] maledetto crash con end e unload

ho notato un paio di cose.
se l'ultimo form rimasto attivo nel progetto è stato mostrato modeless, e
metto una istruzione End nell'evento unload (del form), dà un errore  (di
quelli gravi, con il cerchietto rosso, vietato ai minori...) in ciusura.
se questo form è caricato vbmodal, invece non lo da...
io l'istruzione end l'ho messa per sicurezza... proprio perche senno magari
mi resta qualcosa appeso... come posso fare? devo per forza usare vbmodal ?
MarioH

 se questo form è caricato vbmodal, invece non lo da...
se non metti vbmodal il codice dopo aver caricato il form esegue l'end.
l'END è distruttivo e non dovrebbe mai essere usato
mettici invece un
do while forms.count > 1
  unload forms(forms.count)
loop
e poi unload me (anche se non ci sarebbe bisogno)
--
Fibia "Sakamoto" FBI
E-mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Sito Personale: 
http://www.geocities.com/fibiafbi
VB Simple: 
http://vbsimple.virtualave.net
Membro #26 delle Mitiche Brigate Takahashi sezione Sud

 --
vabbe ma una spiegazioncina sarebbe stata gradita...... ::))))
perche conviene non usarlo? e per essere sicuri di scaricare tutti i form  ?
pensavo che l'end andasse bene.
al limite, secondo te č meglio usare (per concludere il programma) l'API
TerminateProcess passandogli Me.hwnd come parametro ?
in ogni caso, qualcuno sa perche l'errore lo da solo se il form č stato
caricato con form1.show ?
ripeto, se carico for1.show vbmodal, e poi nell'evento form_unload metto ad
un qualsiasi punto l'istruzione end, va tutto bene... quindi il problema
magari non č soltanto dell'end, ma anche del modo in cui si carica il
form.... solo che non ho capito il nesso ....
MarioH

form  ? pensavo che l'end andasse bene.
L'End scarica tutti i Form. Ma NON va bene :) Fatti una classe-insieme 
CForms, ogni volta che devi aggiungere una form usi CForms.Add, ogni 
volta che devi riferirti ad una form usi CForms.Item, quando devi 
chiudere tutte le form setti a Nothing la variabile globale Forms As 
CForms. Insomma, VB ha il reference counting, vogliamo usarlo o no? ;) 
(ora però non so se le form conservano internamente un riferimento a se 
stesse, rendendo obbligatorio un Unload)

> CForms. Insomma, VB ha il reference counting, vogliamo usarlo o no? ;)
ahhhhhh vabbe... se c'è il reference counting... non mi permetto di
contraddire... ::))))
ovviamente non vi chiedo cosa è altrimenti prendete a sassate... resterò col
dubbio per tutta la vita... ::))))
ho provato la seguente soluzione:
for each objForm in forms
    unload objForm
next objForm
sembra funzionare e non dare errori... ora tolgo da mezzo tutti gli end
disseminati per i miei programmi... in pratica mi sento come uno che dopo
una guerra deve togliere le mine dai campi e dalle strade... ::))))
MarioH

next objForm
ops! VB ha già l'insieme dei form, me n'ero proprio dimenticato

 ops! VB ha già l'insieme dei form, me n'ero proprio dimenticato
visto ?? c'è sempre il "pollo" che ha fatto il lavoro sporco al posto
nostro... stavolto il pollo è la microsoft... quindi la soddisfazione è
doppia... !!
MarioH

::))))
Let assegna valori, Set assegna riferimenti, così come = confronta 
valori e Is confronta riferimenti (la limitazione maggiore di VB è di 
poter assegnare e confrontare i valori solo di variabili "piatte", e di 
assegnare e confrontare riferimenti solo di oggetti. In Java ad esempio 
l'unico tipo di dati è l'oggetto, quindi il problema non si pone). Un 
oggetto vive fintantochè esiste almeno un riferimento allo stesso 
(alcuni oggetti si tengono in vita artificialmente conservando un 
riferimento a se stessi), i valori invece ad ogni assegnazione vengono 
clonati e vivono esistenze separate. Eccezione alla regola le stringhe, 
passate per riferimento ma "copy-on-write", cioè sono riferimenti a 
riferimenti a stringhe. Quando uno di questi riferimenti a riferimenti 
viene usato per modificare la stringa, la stringa viene copiata e il 
riferimento a stringa viene modificato per puntare alla copia. Provo a 
spiegartelo con uno schema:
Dim s1 As String, s2 As String
Let s1 = "BlaBlaBla"
Let s2 = s1
In questo caso la situazione è (le frecce significano "si riferisce a"):
s1 ---> s1.buffer ---\
                      \
                       >---> "BlaBlaBla"
                      /
s2 ---> s2.buffer ---/
Se noi facciamo:
Mid(s1, 1, 1) = "b"
Succede prima questo:
                             "BlaBlaBla"
s1 ---> s1.buffer ---\         ^ ^ ^ ^
                      \        | | | |
                       >---> "BlaBlaBla"
                      /
s2 ---> s2.buffer ---/
ossia la stringa viene duplicata, dopodichè alla copia viene applicata 
la modifica (diventando "blaBlaBla"), e alla fine ci ritroviamo con:
s1 ---> s1.buffer ---> "BlaBlaBla"
s2 ---> s2.buffer ---> "blaBlaBla"


Beh dopo certe esperienze con End e Unload io ho preso l'abitudine di
concludere la sub main dei miei progetti con ExitProcess :PP
Ciaotutti,
*

 valori e Is confronta riferimenti
allora lo sapevo... ::))))
lo avrei spiegato con termini meno "tecnici", ma lo sapevo... !!
(ad es: let scopiazza un valore, mentre set azzecca valori...)
MarioH