Autore Topic: [RISOLTO] Raggruppare separatamente molte routine del medesimo tipo  (Letto 990 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
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:
  • le inserisco altrove, ad esempio in un'altra "class" creata ad hoc ?
  • ma "altrove" posso piazzarci solo funzioni, operazioni, o posso metterci anche gli eventi (come appunto un click su un button) ? Insomma, in questo caso, cliccando su un tasto, il programma riconoscerebbe comunque che è accaduto l'evento click, anche se scritto non nella Main.class (principale) ?
« Ultima modifica: 24 Giugno 2011, 00:56:29 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Raggruppare separatamente molte routine del medesimo tipo
« Risposta #1 il: 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.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Raggruppare separatamente molte routine del medesimo tipo
« Risposta #2 il: 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 ?
  • facciamo finta che io ho due tasti: button1 e button2
  • se premo button1, il comando finale dovrà essere un  PRINT variabile_A
  • se premo button2, il comando finale dovrà essere un  PRINT variabile_B
...ovviamente nulla mi vieta di mettere tutto nella FMainClass, ma io voglio spostare la parte afferente ai Button nel modulo.........  :-[
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Raggruppare separatamente molte routine del medesimo tipo
« Risposta #3 il: 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.
 :ciao: :ciao:
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Raggruppare separatamente molte routine del medesimo tipo
« Risposta #4 il: 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)
« Ultima modifica: 23 Giugno 2011, 23:56:29 da md9327 »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Raggruppare separatamente molte routine del medesimo tipo
« Risposta #5 il: 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.  :-*
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: [RISOLTO] Raggruppare separatamente molte routine del medesimo tipo
« Risposta #6 il: 24 Giugno 2011, 09:28:01 »
Si, vabbè, ma i 100 ?  :evil:

 :rotfl: :rotfl: :rotfl:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: [RISOLTO] Raggruppare separatamente molte routine del medesimo tipo
« Risposta #7 il: 24 Giugno 2011, 10:03:31 »
Si, vabbè, ma i 100 ?  :evil:

 :rotfl: :rotfl: :rotfl:

...attendo fattura.   :devil:
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: [RISOLTO] Raggruppare separatamente molte routine del medesimo tipo
« Risposta #8 il: 24 Giugno 2011, 14:27:34 »
 ;D