Newsgroup: it.comp.lang.visual-basic
Titolo: URGENTE: domanda per esperti classi e collections

Sto sviluppando una classe che contiene al suo interno una classe Collection
di classi, spiego meglio:
Classe1
      |
     +--------- Classe2 (Collection di Classe3)
Tutte le classi cono state costruite con la Creazione Guidata Classi.
Il problema:
da una Sub privata della Classe1 devo riempire la Collection (prendendo i
dati da un DB Access).
Ho tentato di fare:
    Dim Obj As Classe3
'   Dim Obj                           ' Non funziona neanche cosi'
    For Each Obj In Collect                                       <----
Errore 438
        ' Assegna valori alle proprieta' di Obj
        ' ...
    Next Obj
Dove Collect e' la Collection
Nel modulo di classe della Classe2 (la Collection), esiste la Sub per
l'enumerazione (For..Each):
'Questa proprietà consente di enumerare questo insieme con la sintassi
For...Each
Public Property Get NewEnum() As IUnknown
    Set NewEnum = mCol.[_NewEnum]
End Property
L'errore 438 e' sulla linea For Each...
Errore 438: Proprieta' o metodo non supportati dall'oggetto.
Cosa ho sbagliato? manca qualche cosa?
Ringrazio in anticipo.
--
Roal Zanazzi
z...@iol.it

...


Hai impostato il procedure ID -4 nella finestra delle proprietą della
funzione _NewEnum? VB riconosce l'oggetto enumeratore dal quell'ID non dal
nome.
Ciao
Corrado



Il mio caso e' un po diverso da questo codice (vedi mia risposta a Corrado
Cavalli, che spero mi abbia indirizzato sulla strada giusta).
Il mio problema e' che Class2 ("derivata" da Collection) sembra non avere
l'operatore di enumerazione, anche se nella classe e' dichiarato:
'Variabile locale per memorizzare l'insieme
Private mCol As Collection
'Questa proprietą consente di enumerare questo insieme con la sintassi
For...Each
Public Property Get NewEnum() As IUnknown
    Set NewEnum = mCol.[_NewEnum]
End Property
Ragazzi, che casino che sono 'ste classi... ma perche' VB non e' ad oggetti
<sigh>...
--
Roal Zanazzi
z...@iol.it

Cosa ho sbagliato? manca qualche cosa?
Roal Zanazzi
z...@iol.it

Dunque... Seleziona la classe dove hai la proprietą New_Enum,seleziona il
menu di VB5 Tools|Procedure Attributes (scusa io ho vb5 in Inglese)
seleziona il nome della tua routine (New_Enum) clicca su Advanced nella
casella Procedure ID scrivi ,a manina, -4 (non esiste tra le varie opzioni
della combo).
Questo in pratica associa alla tua funzione il procedure ID -4 che č quello
riservato alle funzioni che ritornano un oggetto di tipo enumeratore,nel
caso di VB questo viene poi delegato all'oggetto enumeratore della
collection,in teoria potresti scrivertelo anche tu ma non te lo consiglio
visto che richiede l'implementazione della Interfaccia IEnumVariant non
supportata da VB.
Ciao
Corrado

 wrote:
 Scusate se mi intrometto, il -4 significa
 questo:
 - in VB5, dopo avere aperto il tuo progetto,
   premi F2 per aprire l' Object Browser
 - sulla combo dove trovi 'All Libraries'
   selezioni il nome del tuo progetto
 - sotto, nella lista 'Classes' selezioni
   la classe/collection sulla quale vuoi
   l'enumeratore
 - nella lista a fianco: 'Members of xxx'
   ( dove xxx e' il nome della classe che hai
   scelto) selezioni la funzione NewEnum,
   poi cliccando con il tasto destro del
   mouse su NewEnum accedi al suo menu
   di contesto e selezioni 'Properties...'
 - nella finestra delle proprieta' clicchi
   su 'Advanced >>'
 - nella zona delle proprieta' avanzate devi
   eseguire le seguenti operazioni:
    1) selezionare la voce: 'Hide this member'
    2) nel campo 'Procedure ID' devi scrivere:
       -4
 In condizioni normali dopo queste operazioni
 sulla tua classe/collection viene attivato
 l'enumeratore.
 Se nonostante cio' non si attiva allora
 il problema non e' il -4
 Fai sapere come e' andata.
 Ciao,   fabrizio.


Ho risolto il problema. O meglio, adesso non ho piu' il problema...
La soluzione (udite, udite) e' stata la seguente:
cancellare il modulo di classe della classe collection (pare proprio che non
vedesse la funzione di enumerazione, mah?!) e....
RIFARLA DA ZERO!!!!!!!!
Ma guarda te con che ca**o di strumenti mi tocca lavorare!
E non so nemmeno perche' dava quel problema! (e' la cosa che piu' mi fa star
male!)
Comunque grazie a tutti (pochi) quelli che hanno tentato di aiutarmi.
--
Roal Zanazzi
z...@iol.it


Beh, come ho gia' scritto, ho risolto il problema alla radice
(estirpandolo)... ricreando la classe collection :-(
Mannaggia, se avessi aspettato qualche ora!!
Comunque ringrazio Fabrizio e Corrado Cavalli per il loro aiuto.
Mi sa che mi devo mettere a studiare un po' meglio le classi in VB5!
--
Roal Zanazzi
z...@iol.it

E' vero, sono arrivato in ritardo, ma hai provato a mettere
Dim Obj As Classe3
Set Obj As New Class3          <----------- riga suggerita da me
For Each Obj In Collect
' Assegna valori alle proprieta' di Obj
' ...
Next Obj
?
Anch'io ho avuto problemi del genere, e li ho risolti cosě.
E.G. er Cicca

