Newsgroup: it.comp.lang.visual-basic
Titolo: Array di classi ed eventi

Salve a tutto il NG, ho questo problema:
ho una classe, clsEntries che ha una variabile del tipo
Private mclsEntries() as Entry
ed un metodo .Add(New_Entry as clsEntry) che esegue il seguente codice:
redim preserve mclsEntries(1 to maxindex) as Entry
set mclsEntries(maxindex) =New_Entry
Praticamente la classe clsEntries è il contenitore di tante istanze delle
clsEntry, alle quali poi accederò con un metodo .Item(index)
Il problema è che la classe clsEntry alza l'evento
Public Event Error(Code as long)
che dovrei recuperare nella clsEntries ma una dichiarazione del tipo
Private Eithevents mclsEntries() as Entry
mi genere (giustamente) errore! Come poter fare?
Praticamente avrei bisogno di un evento del tipo
Public sub clsEnties_Error(index as integer, Code as Long)
Come poter fare?
Grazie

 Come poter fare?
A meno che tu non abbia nella classe Entries il concetto di "posizione
corrente", cosa che non sembrerebbe, temo che la faccenda sia problematica
Una soluzione, un po' elaborata, che mi viene in mente e' questa:
Togli gli eventi dalla classe Entry e isolali in una classe EntryEvents;
aggiungi a tutti un parametro "sender As Entry" (mettiamolo sempre come
primo per semplicità) e definisci un metodo On<nome evento> per ciascun
evento, con gli stessi parametri di quest'ultimo e all'interno del quale
eseguirai esclusivamente il RaiseEvent corrispondente.
Nella classe Entry aggiungi una property EntryEvents, da istanziare nel
Class_Initialize, e rimpiazza le chiamate a RaiseEvent <nome> con
EntryEvents.On<nome>(Me, <altri parametri>)
Ora, nella classe Enties dichiara una singola variable
Private WithEvents EntriesEvent as EntryEvent
anche questa da inizializzare, e nel tuo metodo ".Add(New_Entry as
clsEntry)" aggiungi l'istruzione
Set New_Entry.EntryEvents = EntriesEvent
in questo modo rimpiazzi in tutti i membri del tuo insieme gestore di eventi
predefinito con quello dell'insieme, unico... attraverso il parametro sender
sei quindi in grado di distinguere quale istanza ha scatenato l'evento.
Spero di essere stato abbastanza chiaro
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 ha scritto nel messaggio
news:bg88hp$lq3b3$1...@ID-138791.news.uni-berlin.de...


 E' lo stesso?
[SNIP]
Piu' o meno
cosi' non hai un vero e proprio evento ma una normale chiamata di metodo, se
dovessi consumare l'evento altrove devi comunque sdoppiare il codice (ovvero
fare sia il RaiseEvent
Per inciso, non ti conviene utilizzare l'indice come discriminante bensi'
l'oggetto stesso, o un altra informazione; questo per i seguenti motivi:
- la singola entry non ha coscienza di dove e' posizionata nella
collection/array, devi impostarlo tu come parametro o property.
- ogni operazione di aggiunta/rimozione/ordinamento della lista comporta il
ricalcolo di tutti o parte degli indici che devono essere riaggiornati.
- ma soprattutto la stessa istanza di Entry potrebbe essere aggiunta a piu'
di una lista Entries in posizione *diversa*
Quest'ultimo punto in particolare e' anche piu' fastidioso da gestire senza
eventi
Ad ogni modo, se ti puo' essere utile, ti allego il codice delle 3 classi
che ho fatto per prova (per inciso Entries e' una classe collection come
quella che ti accennavo)
'--- inizio classe Entries ---
'Variabile locale per memorizzare l'insieme.
Private mCol As Collection
Private WithEvents EntriesEvents As EntryEvents
Private Sub Class_Initialize()
    Set mCol = New Collection
    Set EntriesEvents = New EntryEvents
End Sub
Public Function Add(objEntry As Entry, Optional sKey As String) As Entry
    'tutti gli eventi vengono consumati da quet'unica istanza
    Set objEntry.EntryEvents = EntriesEvents
    If Len(sKey) = 0 Then
        mCol.Add objEntry
    Else
        mCol.Add objEntry, sKey
    End If
    Set Add = objEntry
End Function
Public Property Get Item(vntIndexKey As Variant) As Entry
  Set Item = mCol(vntIndexKey)
End Property
Public Property Get Count() As Long
    Count = mCol.Count
End Property
Public Sub Remove(vntIndexKey As Variant)
    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 EntriesEvents_Error(ByVal sender As Entry, ByVal Code As Long)
Debug.Print sender.Id; Code
End Sub
'--- fine classe Entries ---
'--- inizio classe Entry ---
Private mId As Long 'una property qualunque
Private mEntryEvents As EntryEvents
Private Sub Class_Initialize()
Set mEntryEvents = New EntryEvents
End Sub
Public Property Get Id() As Long
    Id = mId
End Property
Public Property Let Id(ByVal lId As Long)
    'un possibile errore
    If lId < 0 Then
        mEntryEvents.OnError Me, 123
    Else
        mId = lId
    End If
End Property
Friend Property Get EntryEvents() As EntryEvents
    Set EntryEvents = mEntryEvents
End Property
Friend Property Set EntryEvents(objEntryEvents As EntryEvents)
    'assicuriamoci di avere sempre un istanza valida
    If objEntryEvents Is Nothing Then
        Set mEntryEvents = New EntryEvents
    Else
        Set mEntryEvents = objEntryEvents
    End If
End Property
'--- fine classe Entry ---
'--- inizio classe EntryEvents ---
Public Event Error(ByVal sender As Entry, ByVal Code As Long)
Public Sub OnError(ByVal sender As Entry, ByVal Code As Long)
RaiseEvent Error(sender, Code)
End Sub
'--- fine classe EntryEvents ---


 ha scritto nel messaggio
news:bg8t9l$m0hh3$1...@ID-138791.news.uni-berlin.de...


si...... ma imparate a quotare pero'