Newsgroup: it.comp.lang.visual-basic
Titolo: Dll e Form

Cercherň di elencare con un semplice esempio esplicativo, il mio problema,
ringraziando tantissimo gli amici presenti al meeting ai quali l'ho esposto.
Purtroppo sembra che ci siano state incomprensioni, visto che le soluzioni
proposte mi sembra proprio che non funzionino.
Secondo me, una soluzione non esiste, nel senso che quello che vorrei fare
in vb non si puň fare, attendo delucidazioni.
Creo un progetto Dll, lo chiamo DllProva
Inserisco nella Dll una classe, la nomino Class1
in Class1 uno inserisco una function pubblica (metodo) che visualizza un
msgbox, la chiamo Metodo1
Inserisco nella Dll un form, lo nomino FrmProva
Creo un progetto exe standard di test, che usa la Dll
Imposto nei riferimenti DllProva
Provo ad usare Class1 in questo modo
Dim varClasse as DllProva.Class1
Set varClasse = new DllProva.class1
varClasse.Metodo1
'funziona perfettamente, viene visualizzato il msgbox, quindi deduco che il
mio modo di concepire l'utilizzo di una Dll sia corretto
Ora provo ad usare il Form
Dim varForm as DllProva.FrmProva '<<<<<< tipo definito dall'utente non
definito
Set varForm = new DllProva.Frmprova
varForm.Show
'non funziona
Provo con il sistema che mi č stato consigliato al meeting, anche se ho dei
dubbi che infatti sono stati confermati
Ora provo ad usare il Form
Dim varForm as Form
Set varForm = new DllProva.Frmprova '<<<<<< tipo definito dall'utente non
definito
varForm.Show
'non funziona
L'errore si sposta di una riga, come era prevedibile che succedesse.
Prevedevo che non avrebbe funzionato perchč io nell'elenco membri di
DllProva, FrmProva non me lo ritrovo, anche se nel visualizzatore oggetti
c'č
L'unico modo che ho trovato per usare il form, come dicevo, č creare nella
Dll una classe pubblica che funga da interfaccia.
Creo una classe nella Dll e la chiamo ClassForm
Inserisco un metodo visualizza che esegue l'isctruzione frmProva.Show
a questo punto
'Provo a visualizzare il form
Dim varForm as DllProva.ClassForm
Set varForm = new DllProva.ClassForm
varForm.Visualizza
'funziona perfettamente, ma io preferirei agire direttamente sul form.
E' possibile?
--
"Non credo che in tutto il mondo si riuscirebbero a vendere
piů di cinque computer".
-- Thomas J. Watson, presidente dell'Ibm, 1943

E' possibile?
Si puo', ma viene violato il principio di incapsulamento nella "religione"
degli oggetti.
Se proprio (ma proprio proprio) vuoi, puoi esporre il Form tramite 
una proprieta' che restituisca un Object.
A questo punto puoi provare a fare un cast a Form sul valore di ritorno
(da provare, perche' non ci penso neanche ad esporre oggetti interni
ad una dll).
Es.:
Dim varForm as VB.Form
Dim obj As Object
Set obj = DllProva.ClassForm	' qui ritorna un Object
If (not obj Is Nothing) Then
	Set varForm = obj
End If
-- 
hth, hal

 End If
Confermo che sei un fenomeno Hal...
Ho risolto in modo analogo, seguendo lo spunto che mi hai suggerito
Ho inserito nella classe dentro la Dll una proprietà
Public Property Get frmPercorso() As Object
Set frmPercorso = DllGlobal.frmPercorso
End Property
Poi nel progetto Client uso la form in questo modo
Option Explicit
Private dllClass As DllGlobal.clsGlobal
Private WithEvents FrmPercorso As Form
Private obj As Object
Private Sub Command1_Click()
Set dllClass = New DllGlobal.clsGlobal
Set obj = dllClass.FrmPercorso
If Not (obj Is Nothing) Then
Set FrmPercorso = obj
End If
FrmPercorso.Show
End Sub
 Grazie mille.
Ciao

 Cercherò di elencare con un semplice esempio esplicativo
Oggi mentre lo provavo mi si e` rotto il mouse.. seriamente :-)
Ora me ne sono fatto prestare un'altro, BTW ero arrivato al punto in
cui mi ero reso conto che:
1 - I moduli form sono privati (guarda con l'object browser) e non li
puoi esporre direttamente tramite una proprietà pubblica.
2 - Certo sarebbe una scocciatura dovere wrappare tutte le proprietà
di una form da riutilizzare più volte..
Se fosse stato un altro linguaggio, avrei lasciato perdere, ma, con il
fido (?) mouse nuovo alla destra, mi sono poi ricordato di aver letto
qualche giorno fa che il vecchio VB era divertente perche` aveva un
non so che di magico :-)
Il trucco e` il fatto che i Form sono al tempo stesso classi ed
oggetti..
Buon divertimento, e spero che risponda appieno alla tua richiesta ;-)
------------------------
Progetto 2 (dll)
------------------------
- FormDll
------------------------
Public Sub FormDllMethod()
    MsgBox "FormDll Method"
End Sub
------------------------
- Class1
------------------------
Dim myForm As New FormDll
Public Sub Metodo1()
    MsgBox "Ciao"
End Sub
Public Property Get CustomForm() As Object
    Set CustomForm = myForm
End Property
Private Sub Class_Initialize()
    Set myForm = FormDll
End Sub
------------------------
Progetto1 (exe)
------------------------
Private Sub Form_Load()
    Dim a As New Progetto2.Class1
    Dim b As Form
    Dim c As Object
    Set b = a.CustomForm
    b.Show
    a.CustomForm.FormDllMethod
End Sub
------------------------
Un'unico appunto riguardo l'ultima riga dell'exe: ovviamente e` in
late binding, per cui il completamente automatico non funge, ma a
runtime COM fa il suo dovere.
--
ale
www.sen.it

 Ho risolto in modo analogo, seguendo lo spunto che mi hai suggerito
E probabilmente non ci ha nemmeno perso un mouse ;-p
--
ale
www.sen.it