Newsgroup: it.comp.lang.visual-basic
Titolo: Passaggio di parametri tra classi e form

Ciao a tutti,
in un mio programma ho creato diverse classi, ognuna delle quali
ha associato un form.
Durante l'esecuzione è possibile che vengano istanziati più oggetti
di una stessa classe ed è possibile mostrare le finestre associate
anche contemporaneamente. Per questo motivo, ad ogni istanza di una
classe vado ad "allocare" una nuova form del tipo opportuno. E fin
qui non ci sono problemi.
Naturalmente, la form avrà un po' di interfaccia grafica, tra cui tasti
e altre cosucce simpatiche. Nella maggior parte dei casi, un evento
generato dall'utente (click su un tasto) dovrà richiamare un opportuno
metodo dell'oggetto associato. Il problema è: come fa il form a sapere
qual è l'oggetto a sé associato?
Mi spiego con un esempio. Diciamo di avere due classi, Class1 e Class2.
Inoltre abbiamo anche due form, Form1 e Form2.
Nella classe Class1 ho scritto:
  Private frm As Form1
Nella classe Class2 ho scritto:
  Private frm As Form2
Nei rispettivi metodi Initialize ho scritto:
  Set frm = New Form1/2
Quando l'utente vuole visualizzare un form, viene richiamato un metodo
della classe che si chiama ShowForm:
  Public Sub ShowForm()
    frm.Show
  End Sub
Se l'utente clicca sul tasto cmdAzione di Form1 o Form2 è necessario
richiamare il metodo Azione dell'oggetto associato della classe Class1
o Class2. Come fa a sapere il form l'oggetto associato.
Per ora ho risolto scrivendo nel Form:
  Private obj As Class1/2
  Public Sub LoadForm(objParam As Class1/2)
    Set obj = objParam
    Me.Show
  End Sub
e scrivendo, nel metodo ShowForm() di Class1/2:
  Public Sub ShowForm()
    frm.LoadForm Me
  End Sub
A me sembra un po' ridondante e pesante... c'è un metodo migliore?

 qual è l'oggetto a sé associato?
Puoi sempre scatenare un evento al click del tasto su una form che viene
intercettato dalla classe padre....
Nella tua classe dichiari la form così:
Private WithEvents MyForm As Form1
Nella form puo inserire degli eventi personalizzati che gestiscono il click
dei bottoni.
Ti faccio un esempio:
Nella form dichiari un evento generico di click sul pulsante, puoi passare
come argomento il nome del tasto che è stato premuto:
Public Event ButtonClicked (ButtonName As String)
Nell'evento click di ogni tasto:
Private Sub Button1_click()
   RaiseEvent ButtonClicked("Button1")
End Sub
Nella classe intercetti l'evento e controlli che tasto è stato premuto:
Private Sub MyForm_ButtonClicked(ButtonName As String)
    Select Case ButtonName
        Case "cmdAzione"
                'esegui la routine relativa
        Case "cmdAnnulla"
                'annulli l'operazione o altro...
        ........
    End Select
End Sub
Questo è solo un esempio, spero ti possa essere utile.
Ciao
Zephiross

 A me sembra un po' ridondante e pesante... c'è un metodo migliore?
Per quanto mi riguarda e' il metodo corretto; il suggerimento di Zephiross 
e' pure corretto, ma con finestre appena complesse rischia di diventare 
ancora piu' ridondante (molti eventi da rimappare, molti Select Case ...)
Personalmente preferisco lasciare pero' il metodo Show al di fuori del 
metodo LoadForm per maggiore elasticita'... usando i tuoi nomi di funzione, 
assomiglia piu' a:
'Nella form
Private obj As Class1/2
Public Sub LoadForm(objParam As Class1/2)
    Set obj = objParam
End Sub
'Nella classe
Public Sub ShowForm()
    'L'istanza di form non mi serve praticamente mai al di fuori di questa 
chiamata,
    'per cui dichiaro e istanzio solo qui, non nel Class_Initialize
    Private frm As Form1/2
    Set frm = New Form1/2
    frm.LoadForm Me
    Load frm 'il caricamento vero e proprio, che scatena Form_Load
    If <controllo di eventuali condizioni che hanno impedito il caricamento> 
then
        frm.Show 'o .Show vbModal secondo le circostanze
    End If
End Sub
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown 



Premesso che non ho mai usato il vostro sistema e quindi parlo solo in
via teorica, ma mi ricordo un capitolo della MSDN di VB (per quella in
inglese basta cercare "circular references") in cui si parlava appunto
dei riferimenti circolari: in questo caso la classe contiene un
riferimento al form e viceversa il form contiene un riferimento alla
classe. Il problema è che la teoria (ripeto: non l'ho verificato
personalmente) dice che in questo caso VB non e' piu' in grado di
scaricare dalla memoria ne' l'istanza del form (che e' l'stanza di una
classe a tutti gli effetti) ne' l'istanza della classe.
Vi chiedo una conferma o meno della mia ipotesi.
Saluti

 Saluti
Un oggetto potrebbe mantenere un riferimento ad un altro oggetto attraverso 
una sua proprietà, e quest'ultimo a sua volta referenzia il primo.
Si entra in un circolo cui, mi sembra, vb non riesce ad uscirne.
Questo in teoria, in pratica, quando sviluppavo in vb6, penso di averlo 
evitato.
In .net, sembra, che la questione, in teoria, è risolta.
Ave
giuseppeD
---
http://www.infomicroprogetti.it/