Newsgroup: it.comp.lang.visual-basic
Titolo: Visibilità Classe di Insieme (perdo il count giusto)

Ragazzi mi sono intortata da sola e per risolvere questo dilemma ( per
me lo è) mi sono talmente concentrata che il mio cervello è andato in
tilt, sta per fuori uscire tutta quella schifezza grigia ossia tra un pò
esplodo.
Dopo aver scambiato delle opinioni con un "amico", questo mi ha convinto
che è meglio usare Insiemi di Oggetti anzichè caricare dei valori dentro
un array specie se esiste una classe di quel genere.
Ora ho il seguente problema. Non riesco a tenere il Count della Classe
nel modo giusto o meglio, ogni volta che uso il metodo Add della Classe
il Count è sempre a zero, quindi quando vado a caricare il secondo
periodo di inattività (DataInizio,DataFine blablabla), per VB è come se
fosse il primo e il Count è sempre = 1. Grrrrrrrr
Vi spiego in poche parole come e dove ho messo le varie dichiarazioni e
dove ho dimensionato i vari oggetti.
In un MODULO.BAS 
Public Inattivitas   As CInattivitas
.......
Nel form frmProfilo
Public Sub AddIna(Tipo As String, DataFine As Date, DataInizio As 
Date, Mesi As String, Settimane As Integer, GiorniINA As Integer)
Inattivitas.Add Tipo, DataFine, DataInizio, Mesi, Settimane,GiorniINA,
Inattivitas
End Sub
Nell'evento Load di frmProfilo 
Private Sub Form_Load()
    Set Inattivitas = New CInattivitas
    .....
end sub
Ho usato la creazione guidata di VB perchè è la prima volta che uso ( o
cerco di usare) una classe di insieme personalizzata quindi do per
"sicuro" che il metodo Add sia stato creato nel modo giusto comunque ve
lo riporto sotto.
Classe CInattivitas:
'Variabile locale per memorizzare l'insieme.
Private mCol As Collection
Public Function Add(TipoInattività As String, DataFine As Date,
DataInizio As Date, Mesi As String, Settimane As Integer, GiorniINA As
Integer, CInattivitas As CInattivitas, Optional sKey As String) As
CInattività
    'crea un nuovo oggetto
    Dim objNewMember As CInattività
    'Set objNewMember = New CInattività
    'imposta le proprietà passate al metodo
    objNewMember.TipoInattività = TipoInattività
    objNewMember.DataFine = DataFine
    objNewMember.DataInizio = DataInizio
    objNewMember.Mesi = Mesi
    objNewMember.Settimane = Settimane
    objNewMember.GiorniINA = GiorniINA
    Set objNewMember.CInattivitas = CInattivitas
    If Len(sKey) = 0 Then
        mCol.Add objNewMember
    Else
        mCol.Add objNewMember, sKey
    End If
    'restituisce l'oggetto creato
    Set Add = objNewMember
    Set objNewMember = Nothing
End Function
Public Property Get Item(vntIndexKey As Variant) As CInattività
    'Utilizzato per fare riferimento a un elemento nell'insieme.
    'vntIndexKey contiene la chiave o l'indice dell'insieme,
    'e per questo motivo è dichiarata come Variant.
    'Sintassi: Set foo = x.Item(xyz) oppure Set foo = x.Item(5)
  Set Item = mCol(vntIndexKey)
End Property
Public Property Get Count() As Long
    'Utilizzata per recuperare il numero di elementi dell'insieme.
    'Sintassi: Debug.Print x.Count
    Count = mCol.Count
End Property
Public Sub Remove(vntIndexKey As Variant)
    'Utilizzata per rimuovere un elemento dall'insieme.
    'vntIndexKey contiene l'indice o la chiave, e per questo
    'motivo viene dichiarata come Variant.
    'Sintassi: x.Remove(xyz)
    mCol.Remove vntIndexKey
End Sub
Public Property Get NewEnum() As IUnknown
    'Questa proprietà consente di enumerare l'insieme
    'corrente con la sintassi For...Each.
    Set NewEnum = mCol.[_NewEnum]
End Property
Private Sub Class_Initialize()
    'Crea l'insieme quando viene creata questa classe.
    Set mCol = New Collection
End Sub
Private Sub Class_Terminate()
    'Rimuove l'insieme quando la classe viene eliminata.
    Set mCol = Nothing
End Sub
Grazie per avermi letto
Debby
Grazie  MILLE per avermi letto e risposto
Debby Debby
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 End Function
Alcune altre osservazioni:
Non serve passare nuovamente la collection nel suo metodo Add, lei "sa" già chi
è!
Quindi togli il parametro al metodo Add e modifica così:
     Set objNewMember.CInattivitas = Me
Ricorda che se non vuoi tirarti dietro dei casini legati ai riferimenti
incrociati, nel class_terminate del singolo oggetto CInattivita, devi rilasciare
il riferimento che esso detiene alla collection stessa con
    Set CInattivitas = Nothing
Bye
Raf


Ma se faccio cosi mi perdo tutti gli item aggiunti!


 Ma se faccio cosi mi perdo tutti gli item aggiunti!
Mmmmm... anche per questo rinnovo l'invito al ripassino di cui sopra (magari
chiedi al tuo "amico" tanto prodigo di consigli, va' ;-)
Facendo così rilasci solo il riferimento alla collection "madre" che l'oggetto
CInattività eventualmente detiene.
Come ogni variabile oggetto, anche la collection si distrugge (e quindi si
vuota) solo quando viene rilasciato ogni riferimento ad essa (quindi anche
l'istanza pubblica).
Bye
Raf


Ma se faccio cosi mi perdo tutti gli item aggiunti!
Debby