Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: vuott - 23 Giugno 2011, 12:02:25

Titolo: [RISOLTO] Raggruppare separatamente molte routine del medesimo tipo
Inserito da: vuott - 23 Giugno 2011, 12:02:25
Problema:
Sul form ho una trentina di tasti. Per ciascuno di questi - evidentemente - al click sarà prevista una routine con relativa funzione.
Nel codice del programma, che prevede ovviamente anche molto altro, dovrò, pertanto, scrivere 30 routine di eventi click relative a ciascun tasto.

Intenzione:
Io vorrei evitare - per ragioni di chiarezza e di facilità nel controllo visivo dell'intero listato - di inserire, se possibile, tutti quegli eventi click nella main.class. Preferirei, invece, inserire tutte le routine degli eventi click dei tasti - se possibile - in un luogo separato, a parte.

Domande:
Titolo: Re: Raggruppare separatamente molte routine del medesimo tipo
Inserito da: md9327 - 23 Giugno 2011, 14:07:09
Da ambiente ide, basta dare un nome al Group, uguale per tutti i controlli.
Da codice, puoi usare il comando "Object.Attach(oggetto, form, nome gruppo)" messo nel metodo _new() della Form (vedi wiki). "Oggetto" identifica il pulsante o altro controllo che devi associare al gruppo di eventi, "form" è ovviamente il contenitore padre dell'oggetto che detiene il controllo degli eventi, "nome gruppo" è una stringa che identifica il nome che avranno gli eventi.

In tutti i casi, se facciamo un esempio, dando il nome "Event" al gruppo, all'evento Click() verrà associato il metodo "Event_Click()", e sarà utilizzato per tutti i controlli associati allo stesso gruppo.

All'interno del metodo, basta leggere la keyword LAST, che contiene il riferimento al preciso oggetto che ha scatenato l'evento.
Titolo: Re: Raggruppare separatamente molte routine del medesimo tipo
Inserito da: vuott - 23 Giugno 2011, 21:20:06
Da codice, puoi usare il comando....

Perdonami, sono solo - per ora (ed è già molto per me!  :'( ) - riuscito a richiamare dal Form principale genericamente una funzione in un modulo.
Quindi, facendo riferimento alle tue preziose indicazioni (delle quali ti ringrazio), puoi instradarmi sul seguente breve esempio ?
...ovviamente nulla mi vieta di mettere tutto nella FMainClass, ma io voglio spostare la parte afferente ai Button nel modulo.........  :-[
Titolo: Re: Raggruppare separatamente molte routine del medesimo tipo
Inserito da: Picavbg - 23 Giugno 2011, 23:50:15
La spiegazione data dal wiki relativamente alla proprietà "GROUP" è molto chiara ed esauriente. Tuttavia se ti fosse utile un ulteriore aiuto, potresti guardare qui (http://www.gambas-it.org/smf/index.php?topic=1658.msg18578#msg18578).
 :ciao: :ciao:
Titolo: Re: Raggruppare separatamente molte routine del medesimo tipo
Inserito da: md9327 - 23 Giugno 2011, 23:52:51
Non dovrei farlo, perchè se mi scoprono perdo la licenza di bravo programmatore...  ;D

Ma vabbè, solo per questa volta...  :P

Come da tuo esempio, abbiamo due pulsanti, che nominiamo Button1 e Button2 rispettivamente.
Come ti avevo descritto nella precedente, hai due possibilità per gestire con un solo metodo i due eventi Click() scatenati dai due pulsanti, ovvero:

1) agire tramite l'ide di Gambas, definendo un nome alla proprietà Group (presente nella lista delle proprietà a destra e selezionando i due pulsanti). Questa proprietà deve avere un nome uguale per tutti e due i pulsanti, ad esempio la impostiamo a "Event" (lo scrivi nella proprietà). A questo punto, prendi e fai un doppio click su uno dei due bottoni. Vedrai che ti si apre l'editor del codice della Form, che nel frattempo ha aggiunto un nuovo metodo, appunto nominato:
Codice: [Seleziona]
PRIVATE SUB Event_Click()
END
Dentro questo metodo vai a scrivere il codice che ti server per poter stampare la variabile, cos'ì come hai descritto. Sempre come hai descritto, la variabile deve poter cambiare, dipendentemente da quale pulsante hai premuto, e quindi devi prima capire qual'è questo pulsante. Gambas ti fornisce la keyword LAST, che viene usata negli eventi (solo in quelli però), e che contiene il riferimento all'oggetto che lo ha scatenato, quindi:
Codice: [Seleziona]
PRIVATE SUB Event_Click()
  DIM obj AS Object = LAST
  IF (obj = Button1) THEN
     PRINT "Hai premuto il pulsante 1"
  ELSE
     PRINT "Hai premuto il pulsante 2"
  ENDIF
END
E' ovvio che questo che ho scritto è un esempio banalissimo, e più essere ampliato. La keyword LAST, come sopra detto, è un riferimento all'oggetto scatenzante, per cui puoi usarlo per accedere a tutte le proprietà e metodi dell'oggetto stesso (sempre se pubbliche), quindi potresti fare una cosa del genere:
Codice: [Seleziona]
PRIVATE SUB Event_Click()
  DIM obj AS Object = LAST
  IF (obj = Button1) THEN
     PRINT "Hai premuto il pulsante " & obj.Name
  ELSE
     PRINT "Hai premuto il pulsante " & obj.Name
  ENDIF
END
Dato che abbiamo parlato solo di due pulsanti la cosa si potrebbe fermare qui, ma tu pensa se con lo stesso metodo devi poter catturare gli eventi di oggetti di diversa natura. In questo caso sarà necessario capire pure che tipo di oggetto stiamo trattando, e agire di conseguenza (ti ricordo che gli oggetti non hanno tutte le stesse identiche proprietà), quindi:
Codice: [Seleziona]
PRIVATE SUB Event_Click()
  DIM obj AS Object = LAST
  IF (Object.Is(obj, "Button")) THEN
    IF (obj = Button1) THEN
       PRINT "Hai premuto il pulsante " & obj.Name
    ELSE
       PRINT "Hai premuto il pulsante " & obj.Name
    ENDIF
  ENDIF
END
In questo esempio vado prima a capire se il tipo di oggetto fà parte della classe Button generica di Gambas, quindi passo ad analizzarne il riferimento (così come definito nella Form).

2) Agire a livello di codice, associando l'oggetto ad una definizione, tramite il comando:
Codice: [Seleziona]
Object.Attach(Button1, ME, "Event")
Object.Attach(Button2, ME, "Event")
La keyword "ME" stà come riferimento alla classe proprietaria dell'oggetto, in questo caso la Form.

Ci sarebbe anche una terza alternativa, tramite Observer, ma semmai la vediamo in seguito...


Ho chiarito il concetto?  ... sono 100 euri...   8)
Titolo: Re: Raggruppare separatamente molte routine del medesimo tipo
Inserito da: vuott - 24 Giugno 2011, 00:55:09
...sarà un caso, ma credimi md9327, mentre leggevo la tua esauriente risposta sono cominciati i fuochi d'artificio in un paese vicino casa mia. Evidentemente hai fatto contento  :yeah:  anche qualche altro Gambasista !
Ciò che hai scritto è un ottimo contributo che potrà essere ovviamente utile - questa è la cosa più importante - anche ad altri in futuro.

Voglio ringraziare anche Picavbg per il suo contributo.

Sono molto soddisfatto, grazie ancora molto.  :-*
Titolo: Re: [RISOLTO] Raggruppare separatamente molte routine del medesimo tipo
Inserito da: md9327 - 24 Giugno 2011, 09:28:01
Si, vabbè, ma i 100 ?  :evil:

 :rotfl: :rotfl: :rotfl:
Titolo: Re: [RISOLTO] Raggruppare separatamente molte routine del medesimo tipo
Inserito da: vuott - 24 Giugno 2011, 10:03:31
Si, vabbè, ma i 100 ?  :evil:

 :rotfl: :rotfl: :rotfl:

...attendo fattura.   :devil:
Titolo: Re: [RISOLTO] Raggruppare separatamente molte routine del medesimo tipo
Inserito da: md9327 - 24 Giugno 2011, 14:27:34
 ;D