Se apro questa nuova discussione la colpa è solamente di chi mi ha pungolato per utto il tempo della mia recente quarantena.
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:
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
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
CodVoxManAndrebbero 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.