Newsgroup: it.comp.lang.visual-basic
Titolo: utilizzo classi in vb (Class Initialize)

Premesso che sto utilizzando le classi in visual basic da
poco tempo, il mio problema e' questo:
Ho svariate classi definite ognuna delle quali ha bisogno
di accedere al file system i  cui parametri sono definiti
in un file .ini, per cui ho creato una classe cParameter
la quale carica nell'evento Class_Initialize le path globali 
necessarie dal file .ini per l'accesso al file system.
A questo punto in ogni classe ho dichiarato la classe
in questione come seguente:
Private objParam as New cParameter
Credevo che al momento dell'utilizzo della classe contente
la classe cParameter automaticamente mi si scatenava l'
evento Initialize di quest'ultima.
Dopo varie prove per scatenare l'evento Initialize devo o
creare l'oggetto cParameter nell'evento Class_Initialize
dell'oggetto principale oppure utilizzare un metodo della
classe cParameter o utilizzarne una sua proprieta'.
Spero di essermi spiegato a dovere e chiedo inoltre se
qualcuno avrebbe fatto quanto sopra descritto in un modo
piu' elegante, ho visto che esiste anche una direttiva
chiamata Implements ma non so se fa al caso mio.
Il fine del mio lavoro e' quello che devo eseguire la
stessa operazione in modo automatico ogni qualvolta accedo
ad una delle classi create, ecco perche' avevo pensato di
creare una classe ed inserirvi la funzione in questione
ed inglobarla in tutte le classi sviluppate.
Grazie
Roby

evento Initialize di quest'ultima.
Modifica in:
Private objParam As cParameter
Poi, nell' Initalize lo istanzi:
Set objParam = New cParameter.
La dichiarazione As New, in vb5/6, e' nefasta perche' non hai
controllo sull'effettivo momento di inizializzazione.
-- 
ciao, hal

 classe cParameter o utilizzarne una sua proprieta'.
Infatti e' cosi', la dichiarazione 'As New' non inizializza subito l'istanza
objParam ma crea appunto un oggetto "auto-istanziante"; questo vuol dire che
ad ogni accesso viene verificato se la variabile e' istanziata e in caso
contrario viene fatto automaticamente, cosi' come vuole dire che objParam
non potra' mai valere Nothing.
Ora, se i valori che ti interessano sono proprieta' della classe cParameter,
concettualmente il programma funziona come se objParam fosse istanziata
all'avvio; perche' per l'appunto al primo accesso di uno dei membri viene
scatenata la tua routine di inizializzazione dove (presumo) vengono caricati
tutti in blocco. Viceversa se objParam.Class_Initialize valorizza anche
delle variabili globali esterne alla classe allora si presenta il problema
evidenziato, se per esempio provi ad accedere ad una globale senza aver
fatto mai riferimento a objParam.
Al di la' di utilizzare quindi solo membri di cParameter in luogo di
globali, e della soluzione che gia' hai sperimentato, ovvero
Private objParam as cParameter
Private Sub Class_Initialize
    'in tutti gli altri Initialize
    Set objParam = New cParameter
End Sub
corretta ma prolissa, le altre dipendono da come e' strutturato il
programma; per esempio, se, come sembra, i valori che fai caricare a
cParameter sono validi per tutta l'applicazione e non sono in funzione di
ogni singola classe, allora e' poco utile dichiarare un objParam in ognuna
di queste, mentre invece potresti creare un unica istanza globale con
Public objParam As cParameter
Sub Main
    Set objParam = New cParameter
End If
in un modulo BAS, evitando quindi la ripetizione del codice di
inizializzazione in tutte le altre classi.
vedi un po'... Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown


*************************************************
Il problema e' che e' un dll activex e non so se e' possibile definire un main()
Roby
***********************************************

 Il problema e' che e' un dll activex e non so se e' possibile definire un
main
Per potere, si puo'... il punto e' chenon sono sicuro venga eseguito
rigorosamente per primo, come invece e' per gli EXE normali.
Con gli EXE ActiveX puo' effettivamente succedere che prima venga eseguito
il Class_Initialize della prima classe creata e poi il Main, con le DLL non
ne ho mai avuto bisogno e quindi non sono certo.
Ad ogni modo, nel peggiore dei casi, se si vuole comunque mantenere un unica
istanza globale si puo' utilizzare
Public objParam As New cParameter
sempre in un modulo BAS e fare a meno del Main()


Ho inserito in un modulo .bas 
Global objParam as Object e la funzione
 'Sub Main()' dove al suo interno creo l'oggetto con
Set objParam = New CParameter
Poi nelle proprieta' del progetto dll activex ho impostato
 l'oggetto di avvio 'Sub Main()'
Ora le proprieta' e i metodi dell'oggetto cParameter sono 
visibili da ciascuna classe da dove ho eliminato l'ormai
inutile dichiarazione della classe cParameter
Roby

  l'oggetto di avvio 'Sub Main()'
Con le attenzioni che ti dicevo nell'altro messaggio, dovrebbe andare...
pero', abbi pazienza, siccome sono pedante, aggiungo due cose:
- C'e' un motivo particolare per usare Object? la classe ti e' nota, tanto
e' vero che la istanzi nella main dello stesso modulo...
- 'Global' e' considerata obsoleta, ed e' rimpiazzata dal normale 'Public',
che quando usata in un modulo BAS ha lo stesso effetto.
