Autore Topic: Evento Mouse_Click non sempre scatenato  (Letto 935 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Evento Mouse_Click non sempre scatenato
« il: 31 Ottobre 2015, 17:56:10 »
Se apro questa nuova discussione la colpa è solamente di chi mi ha pungolato per utto il tempo della mia recente quarantena.  ;) ;D
Dovendo riprendere il mio ContabFam per snellirne il codice internamente alla Form13.class, a causa di una condizione di errrore scoperta durante l'uso quotidiano del programma, mi sono imbattuto in un problema simile all'attuale, già vissuto ed affrontato qui.
Ora ho potuto inquadrare il problema con l'occhio dell'esperienza acquisita fino ad oggi e posso quindi affermare che l'evento mouse_click non è sempre scatenato. Vi sono oggetti di Gambas che non lo considerano proprio, mentre gestiscono sempre  altri eventi come dblclick, mouseup, mousdown, Enter.ma vi sono anche oggetti come il "Button" che lo gestiscono, insieme a tutti gli altri eventi legati al mouse.
Durante la pesante modifica del codice, purtroppo non ancora terminata, mi sono imbattuto nella necessità di scatenare un nuovo evento, cliccando su un  oggetto di tipo "Button" fuori sequenza.  Gambas risponde alla richiesta, ma solo dopo avere eseguito anche la procedura LostFocus dell'oggetto corrente. Ebbene può capitare che detta procedura di LostFocus contenga istruzioni che non debbano assolutamente essere eseguite qualora il Focus dovesse essere ceduto ad un oggetto naturalmente non successivo nella famosa Gerarchia di Gambas.
É chiara quale necessità mi si sia presentata?  Si?  Allora posso continuare raccontando che ho dovuto prima capire perché non venisse intercettato nessun evento legato al mouse se non dopo la cessione naturale del Focus da parte dell'oggetto corrente:  Gambas, per scelte costruttive di struttura, ha bisogno di abbandonare l'oggetto corrente solamente dopo avere richiamato ed eseguito la procedura LostFocus e sembrerebbe che non sia possibile farlo uscire dal suo schema gestionale degli oggetti.
La prima cosa da fare era come farmi dire da Gambas che, col Focus attivo nell'oggetto.3, fosse stato eseguito un click del mouse sull'oggetto.7 della stessa Form. Non è stata una scoperta facile, ma dopo varie indagini, ho potuto constatare che passando col mouse su un altro oggetto della Form, viene schedulato l'evento Enter. Ho potuto, finalmente,  dialogare con Gambas e registrare un valore all'interno di una variabile globale della Form, variabile che ho potuto interrogare dentro la procedura LostFocus dell'oggetto attivo corrente e saltare così tutte le istruzioni della LostFocus e passare così il Focus al Buttom cliccato poco prima.
Per completezza di quanto ho detto sopra riporto un minimo di codice impiegato per l'occorrenza:
Codice: [Seleziona]
Public Sub PulsCancDig_Enter()
'----------------------------------------------------
  iSwReset = 1
End

Public Sub PulsCancDig_Click()
'------------------------------------
  If iSwReset = 1 Then
      iSwReset += 1   
  Endif
    iSwReset = 0
    bSwErCoVoce = False
    ResetDigForm
    EUR.SetFocus
End

Public Sub CodVoxMan_LostFocus()
'---------------------------------
--- bla --- bla --- bla ----
    Select Case $SetFocus
            Case "EUR", "VoContCas", "VoSotCtoCas"
            Case Else
              CodVoxManLostFocus_mio()
    End Select
End

Private Sub CodVoxManLostFocus_mio()
--- bla --- bla --- bla ----
 If $SetFocus = Null
      If iSwReset < 2 Then
        $Rispo = InizInsiemConti($TbVoCi[iCmbCorr, 0])
        $NuContIni = $Rispo[0]
        $NuContFin = $Rispo[1]
        If $CoVoCorr < $NuContIni Or $CoVoCorr > $NuContFin Then
            Message.Error("Codice Voce <b> '" & $CoVoCorr & "'  </b> esterno ai limiti consentiti (da:'" & $NuContIni & "' a:'" & $NuContFin & "') <BR> <CENTER> --- CORREGGI --- </CENTER>")
            bSwErCoVoce = True
            $SetFocus = Last.name
        Endif
      Endif
    Endif

Riporto anche la sequenza delle procedure come vengono eseguite da Gambas

Citazione
Entrata in 'CodVoxMan_GotFocus'
Passaggio in 'CodVoxMan_Entry'
Entrata in 'CodVoxMan_KeyPress'
Entrata in 'CodVoxMan_KeyPress'
Entrata in 'CodVoxMan_KeyPress'
Entrata in 'CodVoxMan_KeyPress'
Entrata in 'CodVoxMan_KeyPress'
Entrata in 'CodVoxMan_KeyPress'
Entrata in 'CodVoxMan_KeyPress'
Entrata in 'CodVoxMan_LostFocus'
Entrata in 'CodVoxManLostFocus_mio'
Uscita da 'CodVoxManLostFocus_mio' - CoVoCtoCas // $SetFocus= 'CoVoCtoCas'bSwErCoVoce= T
Entrata in 'CtoCollegNo_GotFocus'
Entrata in 'CodVoxMan_GotFocus'
Passaggio in 'CodVoxMan_Entry'
Entrata in 'PulsCancDig_Enter' - Last.Name= 'PulsCancDig'
Entrata in 'CodVoxMan_LostFocus'
Entrata in 'CodVoxManLostFocus_mio'
Uscita da 'CodVoxManLostFocus_mio' - CoVoCtoCas // $SetFocus= ''bSwErCoVoce= T
Entrata in 'PulsCancDig_Click'
Entrata in 'ResetDigForm'
Entrata in 'SpeCoPreFi_Change'
Passaggio in 'CmbVociCont_Change'
Passaggio in 'CmbVociCont_Change'
Entrata in 'EUR_GotFocus'

Ho evidenziato gli eventi  "PulsCancDig_Enter" e "PulsCancDig_Click" per far capire meglio la sequenza con cui Gambas ha eseguito gli eventi stessi. Si vede infatti che l'evento "PulsCancDig_Enter"  viene eseguito mentre è ancora attivo l'oggetto CodVoxMan, mentre l'evento PulsCancDig_Click vienbe eseguito soltanto dopo il completamento della procedura CodVoxMan_LostFocus, conclusiva dell'oggetto CodVoxMan
Andrebbero commentate tutte le righe appena citate, ma occorrerebbe molto tempo e molto spazio. Ciò non toglie che eventuali curiosità o perplessità potranno sempre essere chiarite.
:ciao:

Offline Cocirio

  • Grande Gambero
  • ***
  • Post: 126
  • Sba(di)gliando s'impapera :-).
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #1 il: 03 Novembre 2015, 18:34:12 »
Ciao. Mi intrometto solo per dire che anch'io ho notato l'inutilità di sottoporre a Gambas un evento di Click nell'uso di PictureBox: per questo controllo vengono accettati MouseDown e MouseUp, ma non Click. A mio parere, se il Click non è previsto per un controllo, darebbe corretto che Gambas lo segnalasse. Ma aggiungo che con il MouseDown ho assistito anche a un fenomeno assurdo che, purtroppo, non sono riuscito a capire in quali condizioni si verifica: viene servito senza che io abbia cliccato sulla PictureBox! Sostituendo il MouseDown con il MouseUp, il fenomeno è scomparso.
Queste esperienze le ho fatte durante i test del progetto che ho chiamato 'scoponecoc', cioè il gioco dello scopone. Presto lo metterò tra i progetti degli utenti.
Scusa, Picavbg, il mio intervento poco utile per te. Non credo di essere capace di provare il tuo codice. Però mi sembra che quando si clicca su un pulsante mentre il cursore si trova su un altro controllo selezionato in precedenza, per il quale esiste una subroutine di LostFocus, sia inevitabile che questa subroutine venga eseguita prima del click sul pulsante che a sua volta dovrebbe ricevere il focus. Però tu dici che i due eventi non sono in sequenza. Allora vuol dire che anche tu sei stato vittima di un fenomeno come il mio, che io posso catalogare in una tra due categorie: fenomeno paranormale o BUG di Gambas. :-\

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #2 il: 03 Novembre 2015, 22:03:30 »
Se non ho capito male, credo che Picavbg abbia postato la soluzione e da buon amico l'ha condivisa con noi nel caso avessimo la sua stessa esigenza.
Riguardo PictureBox è vero non ha il click, io quando ho a che fare con un widget prima di usarne gli eventi li provo.
Inserisco l'oggetto in una finestra, aziono tutti i suoi eventi, con print ne guardo il comportamento e poi decido.
Magari scopri che se fai col mouse doppio click ottieni un down un double e due up.
 :ciao:

PS: Secondo me il tuo è un fenomeno paranormale causato da finestra  :evil: posseduta  :evil:   :P

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #3 il: 04 Novembre 2015, 00:18:14 »
Se non ho capito male, credo che Picavbg abbia postato la soluzione e da buon amico l'ha condivisa con noi nel caso avessimo la sua stessa esigenza.
Perfettamente!  :ok:

Però mi rammarico con me stesso, perchè nell'essere stato prolisso prima ho impedito di farmi capire. Vedo di correggermi.
Non tutti gli oggetti grafici di Gambas riportano proprietà di uso generale, come l'evento Click.  Però il Button è uno di quelli che contiene l'evento Click, quindi lo riconosce. Tuttavia, quando si manifesta, pur essendo riconosciuto, non viene schedulato immediatamente, ma solamente dopo la conclusione della procedura LostFocus relativa all'oggetto che detiene il Focus al momento del Click su un Button (per Es.).
Il comportamento di Gambas, secondo una certa logica, non è sbagliato, ma rientra nella struttura costruttiva di Gambas. Ma come succede per il Click , si verifica lo stesso comportamento per la schedulazione degli eventi MouseUp e MouseDown. Non ho esaminato la sequenza operativa dell'evento DblClick e quindi non posso esprimermi.
Io mi sono trovato nell'assoluta necessità di intercettare l'evento Click prima di terminare l'iter operativo dell'oggetto col focus attivo ed ho notato che l'evento Enter viene intercettato e schedulato proprio nel momento in cui il cursore (puntatore del mouse ) entra nell'area disegnata per l'oggetto su cui si cliccherà poco dopo. Ho capito anche che agendo con opportune istruzioni si possa fare in modo di sfruttare tale condizione nella procedura LostFocus dell'oggetto ancora in possesso del Focus e di non eseguire le relative istruzioni. Tale accorgimento mi ha permesso di lavorare sull'evento click simulando una schedulazione immediata  dell'evento Click, cioé, quindi, come se quest'ultimo fosse schedulato prima dell'esecuzione dell'evento LostFocus dell'oggetto col Focus attivo.
Ho voluto, perciò, come ha giustamente ha capito Gianluigi, fare conoscere questa mia scoperta, probabilmente già conosciuta da altri, a tutta la comunità.
Spero di essere stato, questa, volta, meno infelice di quanto fatto nel post d'apertura.
 :(
« Ultima modifica: 04 Novembre 2015, 00:22:02 da Picavbg »
:ciao:

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #4 il: 04 Novembre 2015, 13:01:24 »
Scusa Picavbg
c'è un passo nel tuo codice che non mi è chiaro, nella sub PulsCancDig_Click() incrementi la variabile iSwReset se questa ha valore 1 e subito dopo la poni a 0?
 :rolleyes:


Codice: [Seleziona]

Public Sub PulsCancDig_Click()
'------------------------------------
  If iSwReset = 1 Then
      iSwReset += 1   
  Endif
    iSwReset = 0
...
End

L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #5 il: 04 Novembre 2015, 15:35:19 »
Scusa Picavbg
c'è un passo nel tuo codice che non mi è chiaro, nella sub PulsCancDig_Click() incrementi la variabile iSwReset se questa ha valore 1 e subito dopo la poni a 0?
 :rolleyes:
Codice: [Seleziona]
Public Sub PulsCancDig_Click()
'------------------------------------
  If iSwReset = 1 Then
      iSwReset += 1   
  Endif
    iSwReset = 0
End


Grazie per avermelo segnalato. L'istruzione che va eliminata è la if che, per effetto di una successiva modifica, non serve più. Quindi la procedura aggiornata é :
Codice: [Seleziona]
Public Sub PulsCancDig_Click()
'------------------------------------
    iSwReset = 0

   bSwErCoVoce = False
   ResetDigForm                                       ' procedura di inizializzazione della Form
   EUR.SetFocus
End
:ciao:

Offline Cocirio

  • Grande Gambero
  • ***
  • Post: 126
  • Sba(di)gliando s'impapera :-).
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #6 il: 05 Novembre 2015, 09:36:11 »
Benissimo. L'intervento di sotema ha arricchito la discussione. Mi dispiaceva vederla disertata per giorni :). Quanto a me devo confidarvi che, anche se potreste non credermi, la mia naturale evoluzione verso un rincoglionimento perfetto ;D non si è ancora conclusa :nono:. Tuttavia ieri ho provato a cambiare nel mio scopone l'evento MouseUp in MouseDown e ho fatto qualche partita di test: circa un centinaio :D. Purtroppo il fenomeno paranormale che vedevo prima non si è più manifestato  :hard: Perché? Certamente negli ultimi 15 giorni ho fatto delle modifiche, ma non mi pare che riguardassero il click sulle carte (PictureBox).
Pazienza. Se dovesse ricapitare sarò lieto di comunicarvelo.
A Picavbg devo dire che avevo sottovalutato l'importanza della lista di eventi che aveva postato e, lo confesso  :'(, non avevo capito un c...
Ora ho capito che, usando l'Enter (di cui ignoravo l'esistenza) e uno o più switch hai evitato di ripetere l'esecuzione di quelle istruzioni del LostFocus che non dovevano essere eseguite.
Buon lavoro. Ciao

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #7 il: 06 Novembre 2015, 09:24:57 »
In verità, il metodo che ho illustrato in questa discussione potrebbe essere un capitolo da arricchimento del wiki di questo nostro Forum, ma nella testata della finestra manca il pulsante di collegamento per accedervi, come vi manca anche il pulsante per l'accesso al Blog. Non mi è rimasto altro che riportare la mia esperienza esclusivamente nella presente discussione.
 :(
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #8 il: 06 Novembre 2015, 15:16:30 »
In verità, il metodo che ho illustrato in questa discussione potrebbe essere un capitolo da arricchimento del wiki di questo nostro Forum
Ottima idea, Picavbg !


.... ma nella testata della finestra manca il pulsante di collegamento per accedervi...
Per accedere alla nostra WIKI:
http://www.gambas-it.org/wiki/index.php?title=Pagina_principale

http://www.gambas-it.org/smf/index.php?topic=4436.0
« 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 sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #9 il: 06 Novembre 2015, 16:00:00 »
La WIKI è accessibile anche dalla home page del forum http://www.gambas-it.org/wp/
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #10 il: 07 Novembre 2015, 09:55:58 »
Per accedere alla nostra WIKI:
http://www.gambas-it.org/wiki/index.php?title=Pagina_principale
http://www.gambas-it.org/smf/index.php?topic=4436.0

La WIKI è accessibile anche dalla home page del forum http://www.gambas-it.org/wp/

Grazie per avermi ricordato il procedimento d'accesso al wiki, ma non è quello che occorreva fare con la precedente versione di SMF. Ciò vale anche per l'accesso alla pagine del Blog.
Il mio link d'accesso al Forum, tramite browser, mi presenta la pagina allegata e da essa non ho la possibilità d'accedere nè al Wiki, nè al Blog. Per potere vedere l'esistenza del Wiki devo ricordarmi di accedere alla Home del sito in maniera generica  ("http://www.gambas-it.org"), poi, con la disponibilità della pagina del Blog, posso finalmente cliccare sulla linguetta "Wiki".
Non vi sembra un metodo alquanto elaborato per consultare  il Wiki?
Non pretendo risposte da voi, e nemmeno ho voglia di segnalare la mancanza allo Staff. Voglio solo dire che senza il Vostro aiuto di richiamo alla mia memoria dei nuovi percorsi di pratica conoscitiva, non ci sarei mai e mai più riuscito.
 :(

:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #11 il: 07 Novembre 2015, 17:21:37 »
Non vi sembra un metodo alquanto elaborato per consultare  il Wiki?
Hai perfettamente ragione. Ho segnalato nuovamente il problema a Leo72.
« 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 Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #12 il: 07 Novembre 2015, 17:29:52 »
Stavo proprio per dire che già era stato segnalato, manca anche il tasto donate.
Confido che appena Leo avrà tempo provvederà.
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #13 il: 07 Novembre 2015, 21:57:23 »
manca anche il tasto donate.
Non era mia intenzione elencare ciò che manca, ma visto che hai cominciato tu, debbo dirti che manca anche il tag per riportare codice strutturato come Gambas.
:ciao:

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Evento Mouse_Click non sempre scatenato
« Risposta #14 il: 08 Novembre 2015, 16:22:50 »

 Non era mia intenzione elencare ciò che manca, ma visto che hai cominciato tu...

Si! Ci sto!! Iniziamo una nuova intifada!!! Tiriamo le orecchie a Leo  ;D

 :D :D :D

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro