Assegnare da codice più oggetti ad un Gruppo di eventi
L'assegnazione di uno o più oggetti ad un Gruppo di Eventi consente, mediante il nome comune di quel Gruppo, di sollevare per ciascun oggetto, appartenente a quel Gruppo, gli eventi supportati.
E' possibile assegnare uno o più Oggetti, anche diversi fra loro, ad un unico Gruppo di eventi:
1) agendo nell'IDE di Gambas.;
2) direttamente mediante codice.
Va precisato, che l'attribuzione di un Oggetto a un Gruppo di Eventi mediante codice, avviene attraverso l'assegnazione ad ogni Oggetto creato un Osservatore, il quale intercetta gli eventi scatenati da esso. Ad ogni Osservatore è possibile associare uno o più Oggetti creati.
V'è da rilevare, altresì, che l'attribuzione da codice, successiva, dell'oggetto ad un Gruppo di Eventi annulla l'efficacia di una eventuale attribuzione precedente del medesimo oggetto ad altro Gruppo di Eventi, sia effettuata da IDE che da codice.
Possiamo assegnare via codice uno o più oggetti ad unico Gruppo di Eventi (specificando l'Osservatore degli Eventi) almeno in quattro modi:
- con la parola-chiave As nel momento della dichiarazione e creazione:
Dim variabile As New Tipo_Oggetto(Genitore) As "nome_Gruppo"
o nel momento della creazione:
variabile = New Tipo_Oggetto(Genitore) As "nome_Gruppo"
- con il metodo Object.Attach():
Object.Attach(tipo_Oggetto, Genitore, "nome_Gruppo")
- con Observer:
variabile_tipo_Observer = New Observer(variabile_tipo_oggetto) As "nome_Gruppo"
Esempio:
Public Sub Form_Open() Dim bt1 As New Button(Me) As "gruppOggetti" ' Assegnamo il 1° "Button" all'unico Gruppo degli oggetti che saranno creati Dim bt2 As Button Dim tx As New TextLabel(Me) Dim lb As New Label(Me) Dim obs As Observer ' Assegnamo (fatta eccezione per il 1° "Button" per il quale abbiamo già provveduto in fase di dichiarazione) ' i restanti tre oggetti creati all'unico Gruppo (che qui per esempio denominiamo: "gruppOggetti") negli altri tre modi predetti: ' - quando creiamo l'oggetto: bt2 = New Button(Me) As "gruppOggetti" ' - con il metodo "Attach" della classe Object: Object.Attach(tx, Me, "gruppOggetti") ' - con "Observer": obs = New Observer(lb) As "gruppOggetti" ' Attribuiamo le caratteristiche di ciascun oggetto creato: With bt1 .W = 50 .H = 50 .X = 100 .Y = 100 .Text = "Button1" .Tag = "nel Button1 !" End With With bt2 .W = 50 .H = 50 .X = 100 .Y = 300 .Text = "Button2" .Tag = "nel Button2 !" End With With tx .w = 50 .H = 50 .X = 200 .Y = 100 .Text = "TextLabel" .Tag = "nella TextLabel !" End With With lb .W = 50 .H = 50 .X = 200 .Y = 200 .Border = Border.Raised .Text = "Label" .Tag = "nella Label !" End With End ' L'evento che scatena la seguente routine è, così, comune a tutti e tre gli oggetti ' che, in qualunque dei tre modi sopra descritti, sono stati assegnati ad un unico ' "gruppo" di Eventi (denominato in questo esempio: gruppOggetti). ' Pertanto, in questo caso, passando con il mouse sopra uno qualunque dei tre oggetti creati, si scatena l'evento: Public Sub gruppOggetti_Enter() Dim objGrOgg As Object = Last Print "Sei entrato " & objGrOgg.Tag [ Nota 1 ] End
Uso di Observer( ) e di Object.Attach( ) nella creazione di più oggetti del medesimo tipo
Quando via codice vengono creati più oggetti del medesimo tipo, che devono essere aggregati tutti ad un unico Gruppo di eventi mediante la Classe "Observer()" o mediante il metodo "Object.Attach()", è necessario che ciascun oggetto - all'atto della sua creazione - venga aggregato al Gruppo.
Mostriamo un codice esemplificativo con "Observer()":
Public Sub Form_Open() Dim tb As TextBox Dim n As Byte Dim obs As Observer For n = 0 To 9 With tb = New TextBox(Me) .X = 0 .W = 100 .H = 28 .Y = n * .H .Name = "TextBox_" & Str(n) End With obs = New Observer(tb) As "NomeGruppo" Next End Public Sub NomeGruppo_Change() Print Last.Name End
e con Object.Attach( ):
Public Sub Form_Open() Dim tb As TextBox Dim n As Byte Dim obs As Observer For n = 0 To 9 With tb = New TextBox(Me) .X = 0 .W = 100 .H = 28 .Y = n * .H .Name = "TextBox_" & Str(n) End With Object.Attach(tb, Me, "NomeGruppo") Next End Public Sub NomeGruppo_Change() Print Last.Name End
Note
[1] L'istruzione interna alla routine può essere scritta anche più brevemente così:
Public Sub gruppOggetti_Enter() Print "Sei entrato " & Last.Tag End
ossia la parola-chiave "Last " che, come dice il nome, ritorna il riferimento all'Oggetto che ha scatenato l'ultimo evento.