Proprietà particolari degli oggetti grafici

Da Gambas-it.org - Wikipedia.

Gli oggetti grafici in Gambas, derivano tutti dalla classe base Control, da cui ereditano tutte le caratteristiche necessarie alla loro gestione in anbiente grafico. Tra queste caratteristiche, sono da evidenziare quelle che permettono il disegno e la gestione del loro contenuto, il rispondere agli eventi esterni (es. tastiera e mouse), rappresentare graficamente e in modo diverso tra loro dati gestibili dal programma. Come per tutti i moderni linguaggi, usati per la creazione di programmi in ambiente desktop (grafici), anche Gambas ha un suo set di oggetti, caratterizzati ognuno per particolari funzioni.

Essendo questi oggetti derivati tutti dalla classe base Control, hanno alcune proprietà comuni, di cui alcune forse non troppo conosciute, ma sicuramente utili, se utilizzate correttamente all'interno di un'applicazione.


Group : questa proprietà, 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()

Se ammettiamo di avere nella stessa Form, un serie di checkbox, e ad ognuno assegnamo 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 fà 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(). 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

--- è 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