Gli eventi

Da Gambas-it.org - Wikipedia.

In quasi tutti i linguaggi di programmazione attuali, esiste il concetto di evento.

Un evento è una situazione che viene scatenata al verificarsi di una determinata condizione. Un semplice esempio è la pressione del mouse su un bottone della finestra cui stiamo agendo.

Queste situazioni, appunto, scatenano un evento ben preciso che, nella realtà, eseguono un determinata funzione (o metodo).

In Gambas, per ogni oggetto grafico presente nelle librerie standard a corredo, sono già predefiniti degli eventi, alcuni per le operazioni nella normale interattività con l'interfaccia grafica, altri legati ovviamente alla particolare funzione dell'oggetto stesso. Per fare un esempio, tutti gli oggetti grafici, presenti nelle librerie grafiche di Gambas, dispongono dell'evento "Click", che corrisponde sempre e comunque alla pressione del tasto del mouse in corrispondenza dell'area grafica occupata dall'oggetto stesso. In oggetti particolari, per continuare con gli esempi, come ad esempio ScrollView, sono presenti eventi particolari, come Scroll che, ovviamente, sono implementati per gestire le caratteristiche peculiari dell'oggetto, in questo caso lo scrolling della barra.

Per poter usufruire degli eventi di un particolare oggetto, è necessario implementare un "risponditore", ovvero una funzione che riceve l'evento, e che esegua il codice necessario a processarlo.

In Gambas, la costruzione di queste funzioni, che in realtà sono metodi della classe che le contiene, è piuttosto semplice. L'ambiente di sviluppo stesso rende la cosa semplicissima. Se abbiamo familiarità con l'ide di Gambas e, per esempio, creiamo una Form contenente un Button, al doppio click del mouse sul bottone, l'ide apre la scheda Codice relativa alla Form, con il codice contenuto nella classe, e con aggiunto un nuovo metodo, corrispondente appunto al "risponditore" al click del pulsante.

Ovviamente la stessa cosa può essere fatta manualmente, se si ha abbastanza padronanza e conoscenza degli oggetti usati, e i relativi eventi.

In gambas, la nomenclatura dei metodi evento, segue una ben precisa logica, che non può essere elusa, pena il non funzionamento del metodo stesso. Questa logica prevede che il nome del metodo sia composto dal nome dell'oggetto cui si riferisce l'evento, un carattere di underscore, seguito dal nome dell'evento. Ad esempio:

 PRIVATE SUB Button1_Click()
   . . .
 END

E' da ricordare che, nella costruzione degli oggetti, sia attraverso l'ide di Gambas, che tramite codice, è possibile associare l'oggetto ad un determinato gruppo (proprietà Group). In questo modo, è possibile associare tutti gli eventi di tutti gli oggetti facenti parte di un gruppo, e di utilizzare metodi evento in comune. All'interno poi dei metodi sarà possibile determinare chi ha scatenato l'evento, utilizzando l'istruzione LAST.

Quanto sopra descritto, fà riferimento ad una situazione standard, ovvero l'utilizzo degli oggetti di Gambas, e i loro eventi. Cosa succede quando creiamo un nostro oggetto, e abbiamo la necessità di associargli eventi per gestire particolari condizioni?

Gambas, anche in questo caso, dispone degli strumenti adatti per creare nuovi eventi, tramite l'utilizzo dell'istruzione EVENT.

La parola chiave EVENT, seguita dal nome del nuovo evento, istruisce il compilatore che il nome indicato corrisponde ad un evento, ovvero, permette di implementare negli oggetti che utilizzano la nostra classe, i relativi metodi di intercettazione.

Per fare un semplice esempio, mettiamo il caso di avere creato un oggetto, chiamato "MyObject", e abbiamo la necessità di implementare un modo per comunicare con l'esterno il manifestarsi di una determinata situazione interna, ad esempio il cambio di stato di una variabile di classe, ad esempio "$var". Per poter implementare tale cosa, definiamo uno specifico evento, e lo nominiamo "Change". In testa al codice della classe, e dopo eventuali istruzioni INHERITS e CREATE..., inseriamo la seguente istruzione:

 ...
 EVENT Change() 'le parentesi non sono abbligatorie, in mancanza di parametri
 ...

A questo punto dobbiamo solo decidere dove scatenare l'evento in questione, in questo caso, inseriamo un "RAISE Change()" in ogni parte del codice della classe in cui viene modificato il valore della variabile associata "$var", dopo che questa viene modificata (non importa dove). Ora abbiamo l'oggetto completo dell'evento. A questo punto vogliamo usare la classe nella nostra applicazione... Come per gli eventi delle classi contenute nelle librerie di Gambas, è sufficiente creare la classe nel modulo, o altra classe, che utilizza la nostra MyObject:

 ...
 DIM $my AS MyObject
 Object.Attach($my, ME, "MY") 'attacchiamo gli eventi alla form ME, e diamo al nostro oggetto il nome "MY"
 ...

Ora creiamo il "risponditore" adatto:

 PUBLIC SUB MY_Change()
 ...
 PRINT "Lo stato della variabile $var è cambiato"
 ...
 END

Nell'esempio precedente abbiamo creato tutta la logica necessaria per implementare un semplice evento.

Ma la domanda potrebbe sorgere spontanea: e se io volessi passare dei dati tramite l'evento?

Anche in questo caso, la cosa è molto semplice, basta dichiarare i parametri necessari nella dichiarazione dell'evento:

 ...
 EVENT Change(var AS String)
 ...

In questo esempio abbiamo aggiunto il parametro "var", di tipo String, allo stesso evento creato in precedenza. Nella stessa classe è necessario modificare opportunamente tutte le istruzioni RAISE, riferite all'evento Change:

 ...
 RAISE Change($var)
 ...

Inoltre, sarà necessario modificare opportunamente tutti i metodi "risponditori" a questo evento:

 PUBLIC SUB MY_Change(var AS String)
 ...
 PRINT "Lo stato della variabile $var è cambiato in '" & var & "'"
 ...
 END

In questa situazione, oltre allo scatenare un evento, abbiamo la possibilità di fornire ulteriori informazioni ai metodi "risponditori", e questo, ovviamente, amplia notevolmente le possibilità nelle nostre applicazioni. E' comunque consigliato il fare attenzione a non esagerare nel numero di parametri passati tramite gli eventi, perchè potrebbe causare una riduzione delle risorse e della velocità di esecuzione.

Strumenti personali