Proprietà particolari degli oggetti
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. 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.
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
Se ammettiamo di avere nella stessa Form, 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.
Questo 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 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).
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 1]
Tramite questo metodo è possibile associare gli eventi di un oggetto ad un gestore particolare:
Object.Attach( CheckBox1, ME, "Event" )
Il Metodo accetta tre parametri: l'oggetto (nell'esempio CheckBox1), il contenitore dell'oggetto (il puntatore alla Form=ME), il nome del gestore eventi ("Event").
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] Sull'assegnazione di uno o più Oggetti ad un unico Gruppo di Eventi vedere anche le seguenti pagine: