Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6][?] rendere public un tipo definito in una type library

Ciao a tutti,
ho un progetto composto da + DLL (activeX)
questi componenti dialogano tramite eventi.
In uno di questi eventi vorrei passare un array tipizzato, il cui type è 
una struttura definita in una type library.
quando compilo però il compilatore mi avverte che non è possibile 
utilizzare in un evento un tipo che non sia definito in un modulo 
pubblico. Come posso fare per far si che i tipi presenti nella type 
library siano visti come definiti nella classe pubblica del mio componente?
ovviamente vorrei evitare di dover ridefinire tutti i tipi...
Grazie
Davide

 ha scritto nel messaggio
news:4406af5b$2...@newsgate.x-privat.org...

È strano, in teoria dovrebbe funzionare. Come hai costruito la type library?
Raf

 componente?
Devi spostare la Type in una classe pubblica (Global o GlobalMultiuse) e 
dichiararla come Public.
Ciao 

 È strano, in teoria dovrebbe funzionare. Come hai costruito la type library?
in che senso?
devo aggiungere nella type library qualche direttiva che rende public i 
tipi?
l'ho fatta usando l'IDL e poi compilandola come il tool che è 
distribuito con vc6

 dichiararla come Public.
eh ok lo so :)
ma volevo evitare di "clonare" nella classe la type che è già presente 
nella type library....

 nella type library....
he? 

 he?
Sta dicendo (credo) che la sua type e' dichiarata dentro ad un TLB 
realizzato con un altro linguaggio, al di fuori del progetto.
In questo caso, credo che o includi la TLB nel progetto VB (credo si possa 
fare senza problemi) oppure si, devi ridichiararlo. 

 ha scritto nel messaggio
news:4406c3eb$1...@newsgate.x-privat.org...

Mi correggo: funziona se la structure è definita in una DLL ("vuota", usata a
mo' di type library)! Se invece creo una TLB da IDL invece ottengo proprio
l'errore che hai riscontrato tu.
Non so se ci sono scappatoie utilizzando particolari attributi IDL.
Però da già che usi le interfacce, ti consiglio di aggirare il problema evitando
l'uso di eventi ma utilizzando delle interfacce "callback" di notifica (che tra
l'altro aiutano di più a gestire la compatibilità).
Bye
Raf

 fare senza problemi) oppure si, devi ridichiararlo.
Ma, appunto, se è già pubblicato da un'altra typelib il problema non si 
pone: deve referenziare entrambe.
Ridefinirlo non serve a niente poichè non sarebbe lo stesso oggetto 
nonostante abbia la stessa struttura e quindi non sarebbe compatibile.
Ciao 

 he? 
mhh io ho i tipi definiti in una type library.
volevo sapere se c'era un modo per renderli utilizzabili nei metodi 
pubblici senza doverli ridichiarare all'interno di una classe del progetto

 fare senza problemi) oppure si, devi ridichiararlo. 
io ho inserito la type library come riferimento ma questo non rende i 
tipi utilizzabili in metodi public

 l'altro aiutano di più a gestire la compatibilità).
mhh e come si implementano questi callback?

 pone: deve referenziare entrambe.
non ho capito.
cosa intendi dire?
io ho la TLB, la aggiungo ai riferimenti del progetto e la uso nei 
metodi privati senza problemi. ma se provo ad usarla in metodi public il 
compilatore da errore

 utilizzabili in metodi public
Questo è strano.
Probabilmente è proprio un problema di come questa tlb è compilata, ma mi 
pare comunque strano perchè se vedi il type dal tuo progetto significa che è 
pubblico e quindi non dovrebbe dare errori.
Non ti è possibile spostare questo tipo in una dll di vb?
Ciao 

 ha scritto nel messaggio
news:4406...@newsgate.x-privat.org...

1) Nella TLB definisci un'interfaccia nuova, i cui metodi corrispondono pari
pari agli eventi che vuoi generare.
2) Il form (o la classe) "collettore" che vuoi che risponda agli eventi deve
implementare quell'interfaccia
3) Prima di ogni altra cosa occorre passare alla classe "sorgente" degli eventi
(quella in cui attualmente hai i RaiseEvent) un riferimento al "collettore",
tramite un opportuno metodo di "registrazione callback" da aggiungere
all'interfaccia principale della classe "sorgente".
4) Invece di chiamare RaiseEvent, utilizzi quel riferimento per chiamare
direttamente il metodo dell'interfaccia callback.
5) Prima di rilasciare l'istanza del collettore occorre ricordarsi anche di
"deregistrarlo" con un metodo duale di RegisterCallback.
Spero di essere stato chiaro...
Raf

 Non ti è possibile spostare questo tipo in una dll di vb?
la tlb è usata da tutta la suite di applicativi che sviluppo.
vorrebbe dire ricompilare 5 applicativi, con tutte le loro dipendenze 
(una 30ina di binari alla fine della fiera..)