Proprietà particolari degli oggetti

Da Gambas-it.org - Wikipedia.

Gli Oggetti in Gambas hanno alcune particolari proprietà comuni, molto utili, se utilizzate correttamente all'interno di un'applicazione.

GROUP

La risorsa GROUP, visibile nell'elenco delle proprietà oggetto all'interno dell'IDE di Gambas, permette di assegnare ogni evento scatenato dall'oggetto (vedi ad esempio il click del mouse, o la pressione di un tasto della tastiera) ad un gestore di eventi comune. [nota 1]
Di solito, durante lo sviluppo, in ambiente Gambas ogni evento corrisponde per definizione ad particolare metodo, definito dal nome dell'oggetto e dal tipo di evento (es. Button_Click()). Questa impostazione semplifica notevolmente il programmatore nella scrittura del codice, ma in determinati casi, questo approccio può diventare molto pesante e poco gestibile; un esempio si ha quando una determinata Form, che contiene un numero elevato di oggetti, e che deve rispondere ad un numero altrettanto elevato di eventi. La proprietà Group (di tipo String) può essere usata per definire un'etichetta alternativa, a cui verranno poi associati tutti gli eventi, ovvero verrà definito un gestore alternativo che risponderà a tutti gli eventi di tutti gli oggetti, che avranno assegnato come loro Action la nuova etichetta.

In via generale i "gruppi" aggregano i gestori di Eventi di un insieme costituito da più Oggetti.

Per fare un esempio, supponiamo di avere una Form, contenente una CheckBox con nome "CheckBox1"; di default, ogni evento che viene creato per CheckBox1, usando gli strumenti di base dell'ambiente ide di Gambas, verrà creato con la nomenclatura:


 PUBLIC SUB CheckBox1_<tipo evento>()

dove <tipo evento> assumerà il valore di "Click", per l'evento click del mouse. Se invece si definisce un nome comune nella proprietà Group di ComboBox1, ad esempio "Event", il metodo che risponderà all'evento click sarà:


 PUBLIC SUB Event_Click()


LAST

LAST è una comoda risorsa se vi sono diversi widget identici che svolgono azioni simili.
Se supponiamo di avere nella stessa Form ad esempio un serie di CheckBox, e ad ognuno assegniamo lo stesso valore "Event" nella Proprietà "Group", l'Evento "Event_Click()" risponderà in maniera comune a tutti gli Eventi di tutti i"CheckBox presenti nella Form.
LAST permette di avere una gestione più centralizzata e controllata, rispetto all'avere tante funzioni (o Metodi) diversi per ogni Evento.
La domanda però sorge spontanea: ma come si fa a sapere quale CheckBox è stato cliccato?
La risposta è l'utilizzo della parola chiave LAST.
LAST contiene il riferimento all'Oggetto grafico su cui si è attivato l'ultimo Evento; in questo modo è semplice conoscere quale Oggetto è interessato all'Evento, e agire di conseguenza. Il valore contenuto in LAST può ovviamente essere copiato in un altra variabile, e può essere usato direttamente per determinare il valore delle Proprietà dell'Oggetto stesso (es. LAST.Value ritorna il valore corrente della "CheckBox" cliccata).


Associare gli Eventi di un Controllo ad un gestore particolare mediante Object.Attach()

Oltre alla definizione che si può effettuare tramite la Proprietà "Group" visibile in ambiente ide, nell'elenco delle Proprietà dell'oggetto, la stessa condizione si può ottenere assegnando a livello di codice, usando il Metodo statico Object.Attach(). [nota 2]
Tramite questo metodo è possibile associare gli Eventi di un Contrllo grafico ad un gestore particolare.
Esempio con un CheckBox:

 Object.Attach(CheckBox1, ME, "Evento")

Il Metodo accetta tre parametri: l'Oggetto (nell'esempio CheckBox1), il Contenitore dell'oggetto (il puntatore alla Form=ME), il nome del gestore Eventi ("Evento").
Questa definizione, applicata nel costruttore della Form, esegue lo stesso compito, in modo dinamico e da codice, della proprietà "Group" visibile in ambiente IDE.
L'utilizzo del codice permette, inoltre, di assegnare dinamicamente gli eventi da un gestore all'altro, e credo sia facile intuire le possibilità insite in questa logica.

Un'altra possibilità di definire un nome di evento per un Oggetto creato dinamicamente, all'interno del codice, è quello di dichiararlo durante la creazione dell'Oggetto stesso:


 DIM oCheckBox1 AS CheckBox
 ...
 CheckBox1 = NEW CheckBox( ME ) AS "MyEvent"

in questo modo, tutti gli eventi creati per l'oggetto, risponderanno al prefisso "MyEvent", seguito dall'underscore, e dal tipo di evento:


 PUBLIC SUB MyEvent_Change()
   ...
 END

E' da considerare che, come per l'attributo Group, l'assegnazione dello stesso nome a più oggetti, deve poter essere gestita all'interno dell'evento, in modo da determinare in modo univoco quale oggetto è quello attivo, e che ha scatenato l'evento stesso. In questo frangente, viene in aiuto il comando LAST:


 PUBLIC SUB MyEvent_Change()
   SELECT CASE LAST
   CASE CheckBox1
     ...
   END SELECT
 END


Note

[1] La creazione di un "Gruppo di Eventi" fa riferimento a una sub-routine, e in particolare a un Evento al quale fanno riferimento due o più Oggetti.
Lo scopo dell'attribuzione di più Oggetti a un unico "Gruppo di Eventi" è quello di adottare una scorciatoia per usare un solo Nome comune per identificare quell'Insieme di Oggetti che fanno riferimento a quello specifico Evento.
L'istruzione LAST restituisce l'Oggetto, fra tutti quelli appartenenti al "Gruppo di Eventi", che ha sollevato l'Evento indicato nella dichiarazione della sub-routine.

[2] Sull'assegnazione di uno o più Oggetti ad un unico Gruppo di Eventi vedere anche le seguenti pagine: