Newsgroup: it.comp.lang.visual-basic
Titolo: Variabili Object...come "ucciderle"?

Salve,
sul mio libro dice che per eliminare un oggetto basta impostare la sua
variabile su un altro oggetto o su Nothing. Io ho sritto questo pezzo
di codice:
Private Sub Command1_Click()
	Dim frmProva as New Form1
	Set frmForm1 = New Form1
	frmForm1.Show
End Sub
Private Sub Command2_Click()
	Set frmForm1 =  Nothing
End Sub
Bene, perchè il form non scopare? E poi...ma questi oggettoi a che
servono? A creare tutto quello che posso inserire in un form, però da
codice?
Aspetto news, grazie.
Saluti, ciao ciao.

 perchè il form non scopare?
giuro che mi sono pisciato sotto dal ridere....
non te la prendere

 codice?
Quello che stai sperimentando ora e' solo una piccola parte di quello che puoi
fare; considera che dopo aver imparato questo puoi personalizzare una classe
Form aggiungendo le tue proprieta' e i tuoi metodi, fatto questo immagina di
poter creare tu stesso una nuova classe con tutto quello che serve per trattare
una tua tipologia di informazioni... vedrai che sul tuo libro ti aspettano
ancora un sacco di cose interessanti!
Ciao
--
Luca Dormio
luca....@tin.it
luca....@sig-la.com

una tua tipologia di informazioni...
Esatto, diciamo che vuoi avere due Form1 alla volta: si spera nessuno
aggiunga due oggetti Form, ma dichiari due var As Form1 (esempio: Word, non
ha certo dichiarato 3000 childform, ne fa semplicemente la New ogni volta
che chiedi un nuovo documento, e poi la lascia girare per conto suo).
Ciao

Sfrutto il thread per una mia domanda.
Dato questo codice:
Private ClassCollection As Collection
Private Sub Funzione1
    Dim MiaClasse As Classe1
    Set ClassCollection = New Collection
    Set MiaClasse = New Classe1
    MiaClasse.Proprietą1 = False
    MiaClasse.Proprietą2 = "123"
    ClassCollection.Add MiaClasse
    MiaClasse.Proprietą1 = True
    MiaClasse.Proprietą2 = "456"
    ClassCollection.Add MiaClasse
End Sub
....
....
Sub Form_Unload(i parametri non me li ricordo)
    Dim MiaClasse As Classe1
    While ClassCollection.Count > 0
        Set ClassCollection(1) = Nothing
        ' Per eliminare il riferimento all'oggetto ma non
        ' funziona
    Wend
End Sub
Come fare?
--
Fibia "Sakamoto" FBI
URL: 
www.geocities.com/fibiafbi
E-Mail: 
fibi...@hotmail.com
ICQ UIN 63586057

...


 punta a niente", ma lo puoi benissimo fare.
Mi sono spiegato male, in realta' volevo metterlo in guardia, in generale, su
questo comportamento che quando muovevo i primi passi con le classi mi aveva
lasciato un po' sconcertato:
Dim X As New Classe1
[...]
Set X = Nothing
Debug.Print X Is Nothing    'Stampa FALSE!
dove e' vero che il "Set = Nothing" termina l'istanza corrente, ma al primo
riferimento a X se ne crea automaticamente un'altra e quindi puo' dare
l'impressione che la classe non sia stata distrutta.



ciao

 ha scritto nel messaggio
news:8s6kbf$3os$1...@pegasus.tiscalinet.it...

semplicemente
    Set ClassCollection = Nothing
oppure
    Set ClassCollection = New Collection
se vuoi creare una nuova collection vuota
perchč eliminando la collection elimini implicitamente anche tutti i
riferimenti agli eventuali oggetti contenuti
ciao

 riferimenti agli eventuali oggetti contenuti
Ok, elimino i riferimenti, ma gli oggetti vengono distrutti o
rimangono in memoria?



vengono distrutti. se non esistono altri riferimenti a tali oggetti (tuoi o
di VB);
prova a crearti una tua classe (o form o usercontrol) e ad inserire delle
debug.print nei metodi costruttori e distruttori, e fai un po di prove;
ciao

 distruzione ed eliminazione dalla memoria.
Questa mi giunge nuova
VB ha un garbage collector?
C'e' qualche documentazione in proposito?
Cmq provero' quanto detto da Hellboy e poi vi faccio sapere.



non si tratta di un vero e proprio garbage collector in stile Java, ma
piuttosto di una implementazione di smart pointers a livello di oggetto COM
e VB si basa pesantemente su COM per la gestione degli oggetti;
l'interfaccia base di ogni oggetto COM è la IUnknow, che espone due metodi
interessanti, Addref() e Release(), che servono proprio per contare quanti
riferimenti (puntatori) esistono dell'oggetto in questione;
senza entrare troppo nel dettaglio, quando un oggetto viene instanziato, o
quando un suo riferimento viene assegnato, il  metodo Addref() incrementa un
contatore di utilizzo dell'oggetto; viceversa, quando un riferimento va
distrutto, viene chiamato il metodo Release();
quando in seguito ad un Release() si ha un contatore di utilizzo nullo,
allora viene richiamato il distruttore dell'oggetto;
inutile dire che VB gestisce in maniera nascosta tutto questo procedimento;
se vuoi ulteriori (e più precise) informazioni prova a cercare
documentazione relativa ai principi base di COM e alle interfacce IUnknow e
IClassFactory su MSDN;
ciao

col fucile, quando ti va bene!


questo modo di procedere risulta molto lento per collezioni contenenti
numerosi (migliaia di) oggetti.
meglio fare:
do while ClassCollection.Count > 0
    ClassCollection.Remove 1
loop
set ClassCollection = nothing
Anche se è vero che l'ultima istruzione comporta la distruzione degli
oggetti contenuti, questi vengono solo messi da parte, e vengono eliminati
al termine dell'esecuzione, causando paurosi leak durante l'esecuzione: si
pensi a cosa succederebbe se si svuotasse in quel modo una collezione per
poi riempirla di nuovo con numerosi oggetti. Un bel breakpoint su
class_terminate della classe contenuta nella collezione aiuta a convincersi
di questo.
Con le tre righe scritte sopra l'istruzione set ClassCollection = nothing,
si eliminano esplicitamente gli oggetti della collezione (il flow del
programma passerà per il distruttore (pardon, il class_terminate) degli
oggetti.
Ciao
 Giovanni


è una parola, era una cosa fatta mesi fa per una prova. se ritrovo l'esempio
incriminato scriverò qualcosa di + preciso. Non escludo che il problema
esistesse con collezioni di oggetti che a loro volta inglobavano una linked
list di altri oggetti. Magari il problema neanche era nella collection ma
nella linked list...
A proposito di questo, l'utilizzo di una linked list mi ha dato questi
problemi: mettere a nothing il primo elemento (cosìcché a catena gli altri
dovevano sparire) non mi dava buone performance perché non venivano eseguiti
i distruttori. Appena ho tempo riprovo anche questo aspetto.
Per il momento, concludo dicendo che i casi sono:
a) c'erano dei bachi nella vecchia prova, fortunatamente sono migliorato e
quindi non li ho ripetuti questa volta
b) il problema era più complesso, e in questo caso non lo ricordo nella sua
completezza
c) baco fissato da MS? boh... (poco credito a questa eventualità)