Inserire un oggetto in un item di una ListBox
Spesso, volendo inserire all'interno di uno o più item di una ListBox alcuni oggetti grafici (ComboBox, Button, etc), si sovrappone semplicemente l'oggetto prescelto alla ListBox: l'effetto visivo, grafico è sostanzialmente quello desiderato.
Questa soluzione si rivela in modo evidente approssimativa, sia perché l'oggetto non è parte, non è figlio costituente della ListBox, sia perché esso, essendo meramente sovrapposto alla ListBox, resta totalmente indipendente da questa. Ciò comporta che alcuni eventuali mutamenti dello stato e di alcune proprietà della ListBox non influenzeranno l'oggetto sovrapposto.
Attualmente l'Oggetto grafico ListBox possiede la Proprietà ".Children". Questa circostanza sta a significare che la ListBox è composta anche da almeno un Oggetto Figlio, e la si può verificare con il seguente semplice codice:
Public Sub Form_Open()
Dim ob As Object
For Each ob In ListBox1.Children
Print ob.Name
Next
End
Lanciando il predetto codice, si vedrà in console che la ListBox possiede un solo oggetto figlio, e che tale oggetto è una GridView. La GridView possiede a sua volta un oggetto Figlio: la ScrollArea. Poiché la ScrollArea è un oggetto Contenitore, si potrà utilizzare tale Contenitore inserendo in esso l'oggetto o gli oggetti che si vogliono aggiungere alla ListBox.
In questo modo gli oggetti inseriti nell'oggetto Contenitore, la predetta ScrollArea, faranno parte della ListBox medesima.
Gli oggetti aggiunti in questo modo alla ListBox conserveranno una certa loro autonomia, con particolare riferimento alla gestione dei proprie eventi.
Mostriamo un esempio pratico, nel quale si inseriranno tre oggetti in una ListBox:
Private gw As GridView
Private sa As ScrollArea
Public Sub Form_Open()
Dim b As Byte
Dim obs As Observer
Dim kb As CheckBox
Dim cb As ComboBox
Dim sl As Slider
With ListBox1
.W = 300
.H = 300
End With
For b = 1 To 21
ListBox1.Add(CStr(b))
Next
gw = ListBox1.Children[0]
sa = gw.Children[0]
obs = New Observer(sa) As "Scroll"
' Creiamo e aggiungiamo tre oggetti:
With kb = New CheckBox(sa) As "CheckBox"
.X = 30
.Y = gw.Rows[2].Y
.W = 70
.H = gw.Rows[2].H
.Text = "On/Off"
.Name = "CheckBox"
End With
With cb = New ComboBox(sa) As "ComboBox"
.X = 30
.Y = gw.Rows[3].Y
.W = 100
.H = gw.Rows[3].H
.Text = "Numeri"
.List = ["Uno", "Due", "Tre", "Quattro", "Cinque", "Sei"]
.Name = "ComboBox"
End With
With sl = New Slider(sa) As "Slider"
.X = 30
.Y = gw.Rows[4].Y
.W = 100
.H = gw.Rows[4].H
.Name = "Slider"
End With
End
Public Sub CheckBox_Click()
Print "Utilizzato: "; Last.Name
End
Public Sub ComboBox_Click()
Print "Utilizzato: "; Last.Name
End
Public Sub Slider_Change()
Print "Utilizzato: "; Last.Name
End
Public Sub Scroll_Scroll()
Dim ob As Object
Dim b As Byte = 2
For Each ob In sa.Children
' Per evitare che in caso di scorrimento in alto e in basso dell'oggetto "Figlio", la "ScrollArea", mediante l'apposito cursore laterale, si farà uso della proprietà ".ScrollY" della "ScrollArea" medesima:
ob.Y = gw.Rows[b].Y - sa.ScrollY
Inc b
Next
End