Autore Topic: Eventi intercettabili in un'unica procedura evento della Form di appartenenza  (Letto 2909 volte)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Che sia un bug è da analizzare più a fondo.

Riguardo all'intercettazione da parte della form, essendo in effetti il gestore principale di tutti gli eventi nel complesso, è possibile che vengano deviati anche sulla stessa form.

In definitiva, questo può far pensare ad un errore, e forse lo è, in quanto è stato definito un metodo intercettore per l'oggetto, e quindi dovrebbe essere lui, e solo lui, che tratta l'evento.

Nota: ovviamente, lo scrivere un metodo prima di un altro non inficia sulla logica...  ;D

Essendo KeyPress (e similari) un evento particolare, decicato alla pressione di un tasto sulla tastiera, è possibile che questo segui una diversa strada, ovvero una diversa logica. Ma a pensarci bene, è comunque un'anomalia, che il team di sviluppo dovrebbe correggere, o perlomeno spiegarne il motivo, visto che, come indicato da picavbg, la stessa cosa non accade con altri tipi di evento.

Dato che qui abbiamo un ambassateur  ;D , penso possa mettere insieme due righe da spedire a Benoit...  ;D

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Io penso che l'evento keypress sia volutamente fatto intercettare al form per gestire i tasti scorciatoia dei menu del form stesso, altrimenti dov'e' che devi mettere il focus per poterli gestire? ....

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Sì, è possibile...

In realtà, a livello di linguaggio base (ovvero il c++), i messaggi e gli eventi girano tutti attraverso lo stesso canale, che è intercettato dall'application (che non è proprio quella di gambas), e poi dirottati all'oggetto interessato. E' probabile che, per questo tipo di esigenza (indicata da Milio), sia  in qualche modo splittata in più eventi, di cui uno è verso il gentore (la form), e l'altro verso l'oggetto interessato.
Interessante sarebbe fare una prova, inserendo uno Stop Event nel metodo della form, e vedere se quello dell'oggetto viene comunque chiamato.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Allo stop Event anon avevo pensato. l'ho inserito nella "Form_KeyPress" ed ho notato che viene stoppato tutto il processo. Il curosre rimane fermo sempre alla stessa posizione, il crt immesso non viene preso assolutamente in considerazione e non viene nemmeno scatenato l'evento KeyPress legato all'oggetto attivo al momento, cioè nel mio caso una TextBox.
Chiarito ciò, dovrebbe scattare automaticamente la spiegazione sull'eventuale presenza di un bug?  :-\
 :ciao:
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Come da bandierina alzata da Milio, io non direi sia in realtà un bug, bensì una scelta, anche se discutibile.

Il fatto che l'evento venga bloccato, mi fà pensare che allora venga generato in cascata ovvero, che è la form che intercetta per primo l'evento, e poi decide se propagarlo o meno. Quindi, la logica non è quella di base, ma ha uno scopo preciso.

Ad ogni modo, se questo è vero, nel tuo caso è pure meglio, nel senso che gran parte degli eventi vengono comunque intercettati dalla form, e quindi puoi agire di conseguenza. Se non inserisci anche un metodo per l'oggetto figlio, la cosa termina nella form.

Andando indietro con la memoria (la mia intendo, e non è che la cosa sia un unto fermo... ), credo di aver già discusso sulla gestione degli eventi, e su alcune delle particolarità riscontrate in gambas2, e non credo che in gambas3 siano state stravolte.


Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
gran parte degli eventi vengono comunque intercettati dalla form, e quindi puoi agire di conseguenza.
Se è vero che gran parte degli eventi vengono intercettati prima dello stesso evento nella sfera di trattamento dentro le procedure dell'oggetto figlio, quali sono gli altri eventi che subiscono la stessa sorte dell'evento KeyPress? La documentazione ufficiale di Gambas non riporta indicazioni in merito. Io ho cercato quella relativamente a KeyPress che ho letto da qualche parte a suo tempo, ma non ho trovato proprio niente. Forse non ne sono stato capace io.
Citazione da: md9327
Se non inserisci anche un metodo per l'oggetto figlio, la cosa termina nella form.
Rimanendo all'esempio dell'evento KeyPress che è quello su cui possiamo ragionare, perchè è l'unico che ho potuto realmente provare, se scriviamo due procedure evento: Form_KeyPress e OggettoFiglio_KeyPress, è certo che verranno esguite entrambe, prima, come già ampiamente discusso e provato, la procedura Form_KeyPress e dopo la procedura OggettoFiglio_KeyPress. Supponiamo infatti che la prima delle due emetta il messaggio n.1, mentre la seconda emetta il messaggio n.2, ecco descritte qui sotto le due procedure:
Codice: gambas [Seleziona]
Public Sub Form_KeyPress()
'---------------------------------------------
  Message.Info("Questo messaggio n.1 è stato prodotto dentro la procedura 'Form_KeyPress'")
End

Public Sub DescrMoDigTxt_KeyPress()
'-------------------------------------------
  Message.Info("Questo messaggio n.2 è stato prodotto dentro la procedura 'DescrMoDigTxt_KeyPress'")
End

Ho provato, per riprova di quanto affermato sopra, ed ho ottenuto in sequenza, l'emissione dei due messaggi, prima il messaggio n.1 e poi il messaggio n.2.
Quindi possiamo concludere che,
- in caso di presenza di procedura evento KeyPress solamente nell'insieme delle procedure proprie della Form, l'evento KeyPress viene intercettato dalla Form_KeyPress;
- in caso di presenza di procedura evento KeyPress solamente nell'insieme delle procedure proprie di un OggettoFiglio, l'evento KeyPress viene intercettato dalla OggettoFiglio_KeyPress;
- in caso di presenza di procedura evento KeyPress sia nell'insieme delle procedure proprie della Form che in quelle proprie di un OggettoFiglio, l'evento KeyPress viene intercettato due volte, la prima dalla Form_KeyPress e la seconda dalla OggettoFiglio_KeyPress.

Sarebbe bello e comodo poter ottenere lo stesso effetto per altri eventi, come per. Es.: MouseDown. Sarebbe anche utile ottenere una descrizione dettagliata in merito ai criteri di intercettazione di alcuni eventi particolari nella struttura logica di Gambas come quelli oggetto di questa discussione.
 :ciao:
« Ultima modifica: 20 Luglio 2012, 23:10:11 da Picavbg »
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Per quanto riguarda la documentazione, ormai lo sanno pure i sassi che deficita, ma la cosa non sembra essere completamente recepita dal team di sviluppo. Sò che è pesante documentare un qualcosa, lo faccio sul lavoro giornalmente, e che è resa ancora più complicata se si ha poco tempo a disposizione. Ma farne una +/- completa sarebbe buona cosa e aiutarebbe nello sviluppo.

Comunque, come ho sempre detto e ridetto, e data la scarsità di informazioni, anche a seguito della ancora scarsa diffusione di questo linguaggio, l'unica cosa che si può fare per imparare, e per conoscerne le logiche intriseche, è quella di provare.

Quello che hai fatto, le tue prove, risponde a quanto ho sempre detto, e ne sono contento.

Se vuoi approfondire il discorso, anche come documentazione pratica, sarebbe buona cosa. Anche se un pochino pesante, credo sia il caso di abilitare tutti i metodi per tutti gli eventi, sia della form, che degli altri oggetti figli, così da avere uno schema sul comportamento e la logica che viene seguita da gambas.

Agli inizi ho seguito pure io questa serie di test con gambas1 e gambas2, che mi hanno permesso di capire funzionamento e lacune. Alcune volte l'ho fatto per capire funzionamenti apparentemente anomali anche con gambas3, e lo faccio tutt'ora, tabt'è che ho creato un progetto di test, appunto per questo.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Non ho capito bene: forse dovrei prima scatenare l'evento  :coder: e successivamente  :hatecomputer:
 ;D  :ciao:
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Quello che intendevo, era di attivare tutti gli eventi possibile, sia per la form che per l'oggetto contenuto in quest'ultima.

Mettendo, come hai fatto, dei messaggi, puoi tracciare una mappatura degli eventi scatenati in un determinato momento, e la loro sequenza...

Losò, è un lavoraccio, ma dato che in questo modo si potrà avere un'idea da una soluzione pulita, credo sia una cosa da fare...  :-\

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Tutto chiaro, ma io ... ho fatto solo una battuta di spirito! Almeno questa era la mia intenzione.   ;) Spero di non averti irretito.  ;D ;D
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
 >:( :evil:

 ;D ;D ;D