Newsgroup: it.comp.lang.visual-basic
Titolo: Nuova routine :-)

Salve,
Ecco una nuova routine che sottopongo alla vostra attenzione:
Public Sub RemoveObjects(AObject As Object, AColl As Collection)
    For Each AObject In AColl
        AColl.Remove AObject
    Next AObject
End Sub
Serve per azzerare una collezione da tutti gli oggetti di un certo tipo.
Commenti?
Ciao
Andrea

 Commenti?
remove libera anche la memoria ?

 remove libera anche la memoria ?
Non vorrei dirla io la cassata, ma mi sa che l'hai detta tu...
A quello che mi risulta la memoria in VB viene rilasciata dal
GC, quindi in nessun caso tu puoi davvero "liberarla".
Ciao
Andrea

 Commenti?
non funziona.
Ciao
Alberto
--
E non so se avrò gli amici a farmi il coro,
o se avrò soltanto volti sconosciuti,
canterò le mie canzoni a tutti loro
e alla fine della strada
potrò dire che i miei giorni li ho vissuti...

 GC, quindi in nessun caso tu puoi davvero "liberarla".
cioe' le mie migliaia di "set rs = nothing" potevo evitarmele ?

 Alberto
Andrea

 cioe' le mie migliaia di "set rs = nothing" potevo evitarmele ?
Quando tu imposti a "nothing" semplicemente dici al GC che
quell'oggetto è "pronto" ad essere liberato, ma non è detto che
lui lo liberi all'istante...
Ciao
Andrea

 ha scritto nel messaggio
news:b4pm0t$224d9g$1...@ID-170738.news.dfncis.de...

- E' inutile passare il parametro, se lo scopo e' utilizzarlo solo per il
For Each, basta una variabile locale
- Il metodo Remove vuole come parametro l'indice o la key dell'oggetto, non
l'istanza stessa; non hai garanzia che l'oggetto esponga queste property...
non puoi quindi usare For Each
- Il normale For va effettuato a ritroso, pena disallineamento tra variabile
contatore e oggetti presenti nella collection
Lo stesso risultato, incidentalmente, lo ottieni con
Set AColl = New Collection
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 Set AColl = New Collection
Credo che The DeerBear non voglia ripulire la Collection ma elininare 
dalla collection solo gli elementi di tipo AObject ...
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 ha scritto nel messaggio
news:b4pmkq$21b3k7$1...@ID-51318.news.dfncis.de...

No, perche' in VB6 vige il "reference count", quindi se l'oggetto non e'
piu' puntato viene liberato subito
Se poi ci sia sempre un meccanismo di GC dietro, non lo so, ma comunque non
e' accumunabile a quello introdotto in 
VB.NET
Diciamo che se la variabile rs e' dichiarata localmente, il set = nothing e'
superfluo, ma fa dormire piu' sereni la notte ;-)


Il 3/13/2003 11:34 AM, The DeerBear scrisse:

Secondo me cosi' cancelli tutti gli elementi della collection ...
Sempreche' funzioni per via degli indici che si aggiornano mentre 
rimuovi gli elementi ...


 dalla collection solo gli elementi di tipo AObject ...
ne dubito, perche' altrimenti il codice sarebbe ben diverso...
quand'anche il For Each fosse cosi' sofisticato da utilizzare il tipo della
variabile come filtro (cosa che non fa), usando un parametro "AObject As
Object" vengono per forza di cose eliminati tutti gli elementi


 maxx
Ciao
Andrea

 siano "contigui":
E che non siano troppi (consiglio un long anzichè un integer, e magari di
usare un nome diverso da Count per la variabile, per non confondersi col
.Count della collection, che indica il totale e non il singolo indice).
Anche il passaggio ByRef della variabile AObject è inutile. Puoi
dimensionare un As Object all'interno della sub.
Poi, considera il variare dell'indice al diminuire degli elementi.
Consiglio questa
Public Sub RemoveObjects(ByRef AColl As Collection)
Dim Indice As Long
For Indice = AColl.Count To 1 Step -1
    AColl.Remove Indice
Next Indice
End Sub


 
Non si spiegherebbe la domanda di The DeerBear in caso contrario, visto 
che il codice per ripulire una collection si trova un po' ovunque e 
visto che sappiamo il suo livello come programmatore ...


 Ciao
Ciao
Andrea

 ha scritto

io no, ma magari windows si', se un altro programma gliela chiede.
avevo capito che il gc di vb non fosse proprio esemplare, e specie senza
un'indicazione esplicita tendenzialmente non libera granche'. meglio cosi'.


Beh, i bug esistono sempre.
Però, teoricamente, VB distrugge all'istante, nel momento in cui il RefCount
scende a 0.
Il punto però è che passando quel parametro byref, tu rischi di tenere viva
una referenza ad un oggetto, che quindi non sarebbe distrutto (motivo in più
per dimensionarlo dentro alla sub e non passarlo).
Rimuovendo dalla collection un oggetto, si decrementa di uno il contatore
dei suoi riferimenti, ma lo stesso oggetto potrebbe ancora essere
referenziato da qualcosa d'altro, ad esempio dalla prcoedura che ha popolato
la collection, eccetera.


 ha scritto nel messaggio
news:b4pnhp$21nd6k$1...@ID-170738.news.dfncis.de...

Sfortunatamente credo di si', perche' non mi risulta ci sia modo di passare
un tipo come parametro (e quindi nella routine non puoi usare "If x Is AType
...)
Ecco un possibile tentativo:
Public Sub RemoveObjects(ByVal AType As String, ByRef AColl As Collection)
    Dim i As Long
    For i = AColl.Count To 1 Step -1
        If LCase(TypeName(AColl(i))) = LCase(AType) Then
            AColl.Remove i
        End If
    Next
End Sub


 Ciao
Ciao
Andrea

             AColl.Remove 1
Attenzione che così rimuovi il primo anche se stai valutando il centesimo.
In questo utilizzo occorre che tu riprenda la versione del ForNext Indice
col Long che avevo postato io.


[The DeerBear]

L'unico sistema che mi viene in mente e' questo:
Private Sub RemoveObject(ByRef aColllection As Collection, ByVal aTypeName
As String)
    Dim i As Long
    For i = aColllection.Count To 1 Step -1
        If TypeName(aTypeName) = TypeName(aColllection.Item(i)) Then
            aColllection.Remove i
        End If
    Next i
End Sub
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
UGIdotNET - 
http://www.ugidotnet.org

Private Sub RemoveObject(ByRef aColllection As Collection, _
                                           ByVal aTypeName As String)
    Dim i As Long
    For i = aColllection.Count To 1 Step -1
        If UCase(aTypeName) = _
           UCase(TypeName(aColllection.Item(i))) Then


             AColl.Remove 1
[SNIP]
Come gia' fatto notare da Albe, siccome il remove e' selettivo, non puoi
sapere quale elemento stai cancellando, e quindi usare sempre 1 per andare a
ritroso e' sbagliato...
Ti disturba cosi' tanto usare il For al posto del For Each? le versioni che
abbiamo postato prima dovrebbero essere gia' corrette...


[The DeerBear]
Non l'ho provata, ma se ci tieni tanto al for each per le prestazioni, prova
questa:
Private Sub RemoveTypeFromCollection _
              (ByVal aTypeName As String, _
               ByRef aCollection As Collection)
    Dim item As Variant
    Dim i As Long
    i = 1
    For Each item In aCollection
        If UCase(aTypeName) = _
           UCase(TypeName(item)) Then
            aCollection.Remove i
        Else
            i = i + 1
        End If
    Next item


 Ciao
Ciao
Andrea

 Sbaglio?
Sì. Per fare cose un filo complesse, VB diventa identico a qualunque altro
linguaggio ad oggetti, non più complesso.


 Alberto
Ciao
Andrea

 In quest'ottica che cavolo ci voleva a metter su un meccanismo di sorting?
Ci voleva 
VB.NET
, dove per l'appunto puoi implementare IComparer se non erro
e fare tutti i sort che vuoi ;-)
Onestamente, viste le tue "radici" Delphi, credo ti troveresti molto, ma
molto meglio con il nuovo linguaggio...


 Ciao
Ciao
Andrea

 Ne sei sicurissimo?
Direi di sì.
Nel momento in cui si hanno ben chiari alcuni concetti, soprattutto legati a
programmazione OO e all'utilizzo di puntatori, le differenze fra i vari
linguaggi diventano (quasi) puramente sintattiche.
Mentre, all'altro estremo, per le cose semplicissime VB è molto più semplice
di altri linguaggi.
Ciao
Alberto

 Alberto
Ciao
Andrea

 Perché tutto dipende da cosa si intende per cose "facili".
Con un finale così credo che la discussione potrebbe anche andare avanti
all'infinito...
Ciao
Alberto

 lui lo liberi all'istante...
Attenzione: questo è vero con .NET, dove è il framework che decide quando
"svuotare il cestino".
Con VB il set = nothing è istantaneo.
Il problema è un altro: se la var. è usata da qualcun altro tu abbassi solo
il reference counter e solo all'ultimo set = nothing viene rilasciata la
memoria.
es.:
Dim o1 as object
Dim o2 as new object
set o1 = o2
set o2 = nothing
' o2 è nothing, ma o1 no!
' la memoria viene rilasciata solo quando anche o1 è nothing.
Ciao

 complesso.
Cerca sul sito comune la mia XCollection
Ciao

 Ciao
Ciao
Andrea

 se vuoi una cosa un pň meno banale in VB te la devi far da te.
VB č ottimo per iniziare, poi ci si affeziona, poi le ambizioni aumentano e
VB non basta piů...
Ciao.