Autore Topic: doppia schedulazione evento lostFocus  (Letto 953 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
doppia schedulazione evento lostFocus
« il: 20 Giugno 2010, 22:29:37 »
Nel cammino di sviluppo e prova del mio programma, mi capita ancora di incontrare comportamenti, per me anomali, nell'ide di Gambas, dovuti probabilmente alla mia attuale conoscenza del suo motore. Vengo al dunque:
Ho inserito l'evento CodiceVoceContabile_LostFocus del corrispondente controllo di tipo combobox. In esso accerto la correttezza del testo inserito, combinato con la natura del movimento di cassa corrispondente (Entrata o Uscita). L'accertamento tiene conto del limite estremo valido del gruppo di codici numerici a cui può appartenere il conto e qualora il codice cercato non viene trovato dovrebbe essere emesso un MessageBox di errore prima di chiudere  brutalmente il programma. Riporto qui di seguito il passo di prgramma in questione:
Codice: [Seleziona]
PUBLIC SUB CodiceVoceContabile_LostFocus()
.........bla.....bla.....bla.........................................
FOR EACH RecTab
          IF RecTab!NomeVoce = $_VoceConto THEN
              i_CoVoMov = RecTab!NumVoce          'Codice di CONTO, corrispondente alla Voce contabile primaria
              i_UltCtogrup = i_CoVoMov + 999
          ENDIF
          IF i_CoVoMov > 0 THEN
            IF RecTab!NumVoce <= i_UltCtogrup THEN
              IF RecTab!NomeVoce = $_VoceSotCto
                  i_CoVoMov = RecTab!NumVoce                                 'Codice di SOTTOCONTO, corrispondente alla Voce contabile secondaria
                  $_PartMovSiNo = RecTab!ContrPartSiNo
                  BREAK
              ENDIF
            ELSE
'LabFrm2RicPiaCo:
            Message.Error("Attenzione! ->  Record  'NON TROVATO'" & Chr(10) & Chr(10) & "durante la lettura della Tabella ContabFam.db!piancont'" & Chr(10) & Chr(10) & "in Form2.MovDigOk_Click.LabFrm2RicPiaCo" & Chr(10) & Chr(10) & " il programma verrà chiuso")
            QUIT
            ENDIF
          ENDIF
      NEXT 
Ebbene, non capisco perché, al momento dell'esecuzione della riga relativa al Message.Error, anzicché emettere il messaggio, viene nuovamente schedulato l'evento corrente (PUBLIC SUB CodiceVoceContabile_LostFocus()) e, questa volta, alla ripetizione della riga col precedente messaggio di errore, viene fornito  il messaggio:
Citazione
Message box already displayed
Che vuol, dire?  ???
Ciao a tutti
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: doppia schedulazione evento lostFocus
« Risposta #1 il: 20 Giugno 2010, 23:31:03 »
in pratica vengono emessi due eventi di lostfocus, il primo fa apparire il message , il secondo vorrebbe ma trova già il primo aperto e ti da errore.

non credo sia un problema del tuo codice , puoi aggirare il problema inserendo una variabile booleana di controllo del tipo:
Codice: gambas [Seleziona]

PUBLIC SUB CodiceVoceContabile_LostFocus()
.........bla.....bla.....bla.........................................
FOR EACH RecTab
          IF RecTab!NomeVoce = $_VoceConto THEN
              i_CoVoMov = RecTab!NumVoce          'Codice di CONTO, corrispondente alla Voce contabile primaria
              i_UltCtogrup = i_CoVoMov + 999
          ENDIF
          IF i_CoVoMov > 0 THEN
            IF RecTab!NumVoce <= i_UltCtogrup THEN
              IF RecTab!NomeVoce = $_VoceSotCto
                  i_CoVoMov = RecTab!NumVoce                                 'Codice di SOTTOCONTO, corrispondente alla Voce contabile secondaria
                  $_PartMovSiNo = RecTab!ContrPartSiNo
                  BREAK
              ENDIF
            ELSE
'LabFrm2RicPiaCo:
            
            IF Berrore=FALSE THEN
                 Berrore=TRUE
                 Message.Error("Attenzione! ->  Record  'NON TROVATO'" & Chr(10) & Chr(10) & "durante la lettura della Tabella ContabFam.db!piancont'" & Chr(10) & Chr(10) & "in Form2.MovDigOk_Click.LabFrm2RicPiaCo" & Chr(10) & Chr(10) & " il programma verrà chiuso")
          
               berrore=FALSE
               QUIT
            ENDIF

            ENDIF
          ENDIF
      NEXT  

naturalmente la variabile berrore dovrà essere pubblica

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: doppia schedulazione evento lostFocus
« Risposta #2 il: 21 Giugno 2010, 00:06:56 »
L'evento LostFocus dà spesso generazione di doppie chiamate (non so perché) con il risultato che un Message dà errore perché non può apparire un'altro form modale quando già ne è apparso uno.

Perché non provi ad usare l'evento Change, che viene chiamato quando qualcosa nel controllo viene modificato.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: doppia schedulazione evento lostFocus
« Risposta #3 il: 21 Giugno 2010, 10:07:04 »
@ fsurfing:
ho seguito il tuo consiglio, ma la MessageBox non si é aperta, l'evento lostfocus é stato rieseguito con la conseguenza che nè scaturito un errore grave di sistema (codice #6) da segnalare al supporto di Gambas@users.sourceforge, come puoi vedere dall'immagine fotografata che allego al presente post. :'(


@ Leo72:
Se non ho capito male, tu dici di abbandonare l'evento LostFocus e di utilizzare al suo posto l'evento change, ma l'evento change viene scatenato ad ogni carattere immesso nella casella, quindi per una frase di 100 crt viene scatenato 100 volte. Mi pare ancora più diffcile da gestire rispetto all'evento LostFocus. Io credo che sia  l'evento LostFocus a contenere un'anomalia da segnalare all'autore di Gambas per la conseguente sistemazione. Per procedere in tal senso può essere d'aiuto l'immagine allegata al presente post.

Per cercare di risolvere il mio problema pratico, posso provare a richiamare una nuova form, anche non  modale, per l'emissione del messaggio di errore ed la successiva chiususra brutale del programma, in modo da non farlo più rientrare nell'evento LostFocus di partenza.  ;)
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: doppia schedulazione evento lostFocus
« Risposta #4 il: 21 Giugno 2010, 10:48:23 »
Ho provato inserendo una mia form di messaggio di errore ed il risultato non cambia: il programma non viene chiuso; l'evento lostfocus continua imperterrito il suo percorso: dopo aver preso il controllo del programma non lo lascia più e scatena errori non significativi.

Aggiungo per una maggiore precisazione che l'errore grave da segnalare al supporto tecnico compare solamente dopo avere inserito breakpoint di debug. Togliendoli tutti, non compare più, ma l'esecuzione del programma impazzisce.
 :o
Sono finito in un vicolo cieco?  ??? 

Ciao a tutti
:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: doppia schedulazione evento lostFocus
« Risposta #5 il: 21 Giugno 2010, 10:50:15 »
Hai ragione, non avevo pensato a questo.
Secondo me ti conviene seguire altre strade, tipo utilizzare una casella textbox a fianco del combobox in cui digitare ciò che devi mettere poi nel menu a tendina.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: doppia schedulazione evento lostFocus
« Risposta #6 il: 21 Giugno 2010, 13:19:49 »
Hai ragione, non avevo pensato a questo.
Secondo me ti conviene seguire altre strade, tipo utilizzare una casella textbox a fianco del combobox in cui digitare ciò che devi mettere poi nel menu a tendina.
In effetti la ComboBox in questione è stata dichiarata "readOnly" perché il caricamento delle voci contabili viene realizzazto automaticamente in virtuù della natura dell'importo di Entrata/Uscita, per cui l'utente non può digitare alcun carattere. Ho comunque superato l'ostacolo trasferendo tutte le ustruzione dall'evento LostFocus ad una nuova classe dinamica che richiamo al click sul pulsante di OK per "Digitazione comletata nel Form".
Ora infatti il MessageBox di errore viene formulato bene ed il programma si comporta proprio come volevo. :D

Resta il fatto, secondo me, che l'Evento LostFocus, così come é improntato nell'IDE di Gambas, non funziona. Tutti sappiamo che é un evento che deve essere esguito una ed una sola volta, prima che il controllo del programma passi all'oggetto successivo del Form. Perciò, scusa se insisto, il supporto@Gamabs .it dovrebbe segnalare l'anomalia all'autore del linguaggio perché quest'ultimo proceda all'eliminazione dell'anomalia stessa.

Tu mi hai suggerito di percorrere una strada alternativa,  e sono d'accordo, per aggirare prontamente l'ostacolo e proseguire nella mia realizzazione, ma ciò non toglie che l'anomalia venga estirpata.
 ;)

Ciao.
:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: doppia schedulazione evento lostFocus
« Risposta #7 il: 21 Giugno 2010, 16:11:10 »
Stasera lo segnalo sulla mailing list.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: doppia schedulazione evento lostFocus
« Risposta #8 il: 21 Giugno 2010, 22:42:36 »
@Leo:
Grazie per il supporto. Relativamente alla discussione corrente, non so come comportarmi, perché, da un lato,  il problema riscontrato é stato superato spostando il codice in una classe esterna, dall'altro, rimane la questione aperta in attesa di un'eventuale soluzione da parte dell'autore di Gambas. Tu che ne pensi?


Approfitto dell'occasione per avere un chiarimento: in fondo a ciascuna discussione sono presenti due pulsanti affiancati "Rimuovi discussione | Chiudi discussione"
"Chiudi discussione" richiama la funzione [RISOLTO], come si fa manualmente con "Modifica" e scrivendo la parola chiave "RISOLTO" sul primo post?
"Rimuovi discussione" --> Perché mai si dovrebbe rimuovere una discussione?
Grazie ancora.
Ciao.
« Ultima modifica: 21 Giugno 2010, 22:51:26 da Picavbg »
:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: doppia schedulazione evento lostFocus
« Risposta #9 il: 21 Giugno 2010, 23:02:11 »
1) non mi esprimo sul comportamento di LostFocus, mi riservo di aspettare prima la risposta di qualcuno che "conta"

2) "Chiudi discussione" in realtà la "allucchetta", in modo che non sia possibile aggiungere ulteriori post. "Cancella discussione" sarebbe un comando per i mod, che a loro insindacabile giudizio possono rimuovere discussioni che infrangono palesemente il regolamento di questo forum. Adesso, su 2 piedi, non mi ricordo i permessi degli utenti normali per quanto riguarda "Chiudi", però "Cancella" dovrebbe essere interdetto.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: doppia schedulazione evento lostFocus
« Risposta #10 il: 21 Giugno 2010, 23:43:00 »
@ Leo72:
1) Quindi, se non ho capito male, prima di apporre [RISOLTO] alla discussione, aspettiamo la risposta di quel "qualcuno che conta". :D
Va bene. Ciao
:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: doppia schedulazione evento lostFocus
« Risposta #11 il: 22 Giugno 2010, 09:10:33 »
Beh, sì. Anche perché il problema lo hai aggirato, non risolto.
Visita il mio sito personale: http://www.leonardomiliani.com