Poniamo il caso di avere un progetto, dunque, avente due Form: uno principale (FMain) e l'altro secondario (Form1).
Nel Form principale porremo questo codice:
Public lb As ListBox ' Dichiara una variabile pubblica di tipo "ListBox". Essendo "pubblica", potremo richiamare e gestire tale variabile anche dal Form secondario (Form1)
Public Sub Form_Open()
Form1.Show ' Mostra il Form secondario
With lb = New ListBox(Me) ' Crea effettivamente la ListBox sul Form principale impostando alcune caratteristiche
.W = 200
.H = 200
.X = 100
.Y = 100
End With
End
Nel Form secondario porremo quest'altro codice:
Public Sub Form_Open()
Me.Center ' All'apertura del Form secondario lo piazza al centro dello schermo
End
Public Sub Button1_Click()
FMain.lb.Add(TextBox1.Text) ' Individua, ripercorrendo la gerarchia, la variabile di tipo ListBox per gestirla (assegnandole il testo presente nella TextBox)
End
...se vuoi inserire a mano sul Form principale la ListBox, evitando così di crearla da codice, puoi usare - per la sua successiva gestione - una variabile "pubblica" di tipo ListBox, alla quale assegnerai la ListBox medesima.
Nel Form principale porremo questo codice:
Public lb As ListBox ' Dichiara una variabile pubblica di tipo "ListBox". Essendo "pubblica", potremo richiamare e gestire tale variabile anche dal Form secondario (Form1)
Public Sub Form_Open()
Form1.Show ' Mostra il Form secondario
lb = ListBox1 ' Assegnamo alla variabile di tipo "ListBox" la variabile "ListBox1"
End
Nel Form secondario porremo quest'altro codice:
Public Sub Form_Open()
Me.Center ' All'apertura del Form secondario lo piazza al centro dello schermo
End
Public Sub Button1_Click()
FMain.lb.Add(TextBox1.Text) ' Individua, ripercorrendo la gerarchia, la variabile di tipo "object" per gestirla (assegnandole il testo presente nella TextBox)
End
.....oppure, volendo, al posto della variabile di tipo ListBox puoi usare una variabile di tipo Object, alla quale assegnerai la ListBox medesima.
In sostanza la ListBox potrà essere gestita anche attraverso quella variabile di tipo Object.
Nel Form principale porremo questo codice:
Public ob As Object ' Dichiara una variabile pubblica di tipo "Object". Essendo "pubblica", potremo richiamare e gestire tale variabile anche dal Form secondario (Form1)
Public Sub Form_Open()
Form1.Show ' Mostra il Form secondario
ob = ListBox1 ' Assegnamo alla variabile di tipo "Object" la variabile "ListBox1"
End
Nel Form secondario porremo quest'altro codice:
Public Sub Form_Open()
Me.Center ' All'apertura del Form secondario lo piazza al centro dello schermo
End
Public Sub Button1_Click()
FMain.ob.Add(TextBox1.Text) ' Individua, ripercorrendo la gerarchia, la variabile di tipo "object" per gestirla (assegnandole il testo presente nella TextBox)
End
.....alcuni programmatori non amano le variabili di tipo "Pubblico", preferendo così il passaggio di dati attraverso la chiamata di sub-routine.
Se fai parte di tale schiera, puoi utilizzare quest'altro codice.
Nel Form principale porremo questo codice:
Public Sub Form_Open()
Form1.Show ' Mostra il Form secondario
End
Public Procedure RiceveDati(dati As String) ' Impostiamo la sub-routine atta a ricevere i dati provenienti dal Form secondario
ListBox1.Add(dati)
End
...ma, come vedi, qualcosa di "Pubblico" anche in questo caso deve esserci. ;D
Nel Form secondario porremo quest'altro codice:
Public Sub Form_Open()
Me.Center ' All'apertura del Form secondario lo piazza al centro dello schermo
End
Public Sub Button1_Click()
FMain.RiceveDati(TextBox1.Text) ' Individua, ripercorrendo la gerarchia, ed invoca la sub-routine per passarle i dati di tipo stringa
End
md9327 e milio suggerirebbero senz'altro anche l'uso di un oggetto Observer e l'istruzione Event, con il quale appunto "osservare" la sollevazione di un Evento speciale da parte del Form secondario, quando si clicca sul Button per passare i dati.
Nel Form principale porremo questo codice:
Public Sub Form_Open()
Dim ob As Observer
Form1.Show ' Mostra il Form secondario
ob = New Observer(Form1) As "osserva" ' Pone sotto osservazione il Form secondario e lo attribuisce ad un "Gruppo", rendendo così gestibili i suoi eventi.
End
Public Sub osserva_InviaDati(dati As String) ' Questa sub-routine verrà sollevata dall'istruzione "Event" del Form secondario
ListBox1.Add(dati)
End
Nel Form secondario porremo quest'altro codice:
Event InviaDati(s As String)
Public Sub Form_Open()
Me.Center
End
Public Sub Button1_Click()
Raise InviaDati(TextBox1.Text) ' Solleva l'evento nella sub-procedura presente nel Form principale
End
....ma, ovviamente, puoi sostituire la Classe Observer con Object.Attach().
Quindi nella Classe del Form Principale il codice sarà semplicemente così:
Public Sub Form_Open()
Form1.Show
Object.Attach(Form1, Me, "osserva") ' Come "Observer", anche questa istruzione attribuisce il Form secondario (Form1) ad un "Gruppo", rendendo così gestibili i suoi eventi.
End
Public Sub osserva_InviaDati(dati As String)
ListBox1.Add(dati)
End
Nel Form secondario il codice resterà identico al caso precedentemente visto con Observer:
Event InviaDati(s As String)
Public Sub Form_Open()
Me.Center
End
Public Sub Button1_Click()
Raise InviaDati(TextBox1.Text) ' Solleva l'evento nella sub-procedura presente nel Form principale
End
......potresti esperire anche la sollevazione di un evento specifico del Form principale al cambio della sua proprietà .Title ed assegnando alla proprietà .Tag del Form il valore da passare alla ListBox.
Questo però modificherà il titolo della finestra principale, ma con qualche accortezza (per esempio ponendo uno spazio iniziale ed finale) potresti renderlo non evidente.
Quindi nella Classe del Form Principale il codice sarà semplicemente così:
Public Sub Form_Open()
Form1.Show
End
Public Sub Form_Title() ' Quando viene cambiato la proprietà ".Title" del Form principale si scatena questo evento
ListBox1.Add(Me.Tag) ' Si assegna alla "ListBox" il contenuto della proprietà ".Tag" del Form principale
End
Nel Form secondario porremo quest'altro codice:
Public Sub Form_Open()
Me.Center
End
Public Sub Button1_Click()
With FMain
.Tag = TextBox1.Text
.Title = " titolo " ' Qui va il titolo della finestra (Form) principale con la semplice aggiunta di uno spazio all'inizio ed uno alla fine
End With
End
Vorrei solo aggiungere relativamente all'ultima possibilità mostrata sopra che, se non vuoi utilizzare la modifica del titolo del Form principale, analogamente puoi utilizzare un oggetto qualsiasi, generato ma non definito nelle sue dimensioni, come nell'esempio che segue.
Nella Classe del Form Principale il codice sarà:
Public ta As TextArea
Public Sub Form_Open()
ta = New TextArea(Me) As "ta"
Form1.Show()
End
Public Sub ta_Change() ' Quando viene cambiato la proprietà ".Text" della TextArea, si scatena questo evento
ListBox1.Add(ta.Text) ' Si assegna alla "ListBox" il contenuto della proprietà ".Text" della TextArea
End
Nel Form secondario porremo quest'altro codice:
Public Sub Form_Open()
Me.Center
End
Public Sub Button1_Click()
FMain.ta.Text =TextBox1.Text
End