Avevo già incontrato difficopltà ad utilizzare il metodo "SetFocus", ma non ho resa nota la mia difficoltà al Forum perché utilizzando l'istruzione "ME.Conttrol_GotFocus" avevo aggirato lì'ostacolo. Ora, trovandomi a dovere ricedere il controllo allo stesso ComboBox, più avanti nel programma, la soluzione pratica appena citata non ha funzionato; allora sono tornato al metodo SetFocus che dovrebbe essere quello più adatto per restituire il focus al controllo ConboBox interessato. Riporto il codice in cui nasce il problema:
PUBLIC SUB DtContOk_Click() 'pulsante OK diconferma della data digitata
DIM $_Data AS String
DIM $MenuActSiNo AS GestMenu 'serve a richiamare la classe 'GestMenu'
DIM $TestData AS TestData 'serve a richiamare la classe 'TestData'
$_GGDtCont = DtContGG.Text
$_MMDtCont = DtContMM.Text
$_AADtCont = DtContAA.Text
$TestData = NEW TestData($_GGDtCont, $_MMDtCont, $_AADtCont) 'richiama la classe 'TestData'per verificare la validità formale della data contabile immessa
IF ModuliVari.b_VeroFalso = FALSE THEN
Message.ERROR("A T T E N Z I O N E !" & Chr(10) & "La data contabile immessa non é valida" & Chr(10) & "C O R R E G G I")
ME.DtContGG_GotFocus() ' ## questa istruzione viene esguita correttamente perché é l'ultima istruzione appartaenente allcondizione di "FALSE"
ELSE
ME.VerifGGChiusa() subroutine di intercettazione di record di riepilogo di giornata contabile chiusa con data = a quella digitata
IF $_Sw = "Erro" THEN 'variabile stringa definita come PRIVATE nella Form. Il valore "ERRO" predispone lo spostamento del focus per la correzione della data digitata
DtContGG.SetFocus ' il focus non passa al controllo indicato ed il programma prosegue con le istruzioni successive all'ENDIF
ENDIF
IF $_AADtCont < "2002" THEN
ModuliVari.$_TipoValuta = "£" 'permette di gestire importi senza crt decimali
ELSE
ModuliVari.$_TipoValuta = "€" 'permette di gestire importi con 2 crt decimali
ENDIF
'$MenuActSiNo = NEW GestMenu
ME.Close
Form2.Text = "Inserimento Movimenti del : " & DtContGG.Text & " - " & DtContMM.Text & " - " & DtContAA.Text
Form2.Show
ENDIF
END
Il programma dovrebbe fermare il suo ciclo esecutivo in attesa della correzione della data contabile da parte dell'utente; invece, prosegue fino alla presentazione della form successiva, alla quale dovrebbe arrivare solamente dopo avere accertato l'esattezza formale e logica della data digitata. Per completezza allego la Form di digitazione della data contabile di resgistrazione movimenti.
Spero tanto che sia io a non utilizzare bene il metodo "SetFocus"!
Dimenticavo di dire che nel mio programma utilizzo le componenti gb.qt
:-( :ciao:
prova così
PUBLIC SUB DtContOk_Click() 'pulsante OK diconferma della data digitata
DIM $_Data AS String
DIM $MenuActSiNo AS GestMenu 'serve a richiamare la classe 'GestMenu'
DIM $TestData AS TestData 'serve a richiamare la classe 'TestData'
$_GGDtCont = DtContGG.Text
$_MMDtCont = DtContMM.Text
$_AADtCont = DtContAA.Text
$TestData = NEW TestData($_GGDtCont, $_MMDtCont, $_AADtCont) 'richiama la classe 'TestData'per verificare la validità formale della data contabile immessa
IF ModuliVari.b_VeroFalso = FALSE THEN
Message.ERROR("A T T E N Z I O N E !" & Chr(10) & "La data contabile immessa non é valida" & Chr(10) & "C O R R E G G I")
ME.DtContGG_GotFocus() ' ## questa istruzione viene esguita correttamente perché é l'ultima istruzione appartaenente allcondizione di "FALSE"
ELSE
ME.VerifGGChiusa() subroutine di intercettazione di record di riepilogo di giornata contabile chiusa con data = a quella digitata
IF $_Sw = "Erro" THEN 'variabile stringa definita come PRIVATE nella Form. Il valore "ERRO" predispone lo spostamento del focus per la correzione della data digitata
DtContGG.SetFocus ' il focus non passa al controllo indicato ed il programma prosegue con le istruzioni successive all'ENDIF
ELSE
IF $_AADtCont < "2002" THEN
ModuliVari.$_TipoValuta = "£" 'permette di gestire importi senza crt decimali
ELSE
ModuliVari.$_TipoValuta = "€" 'permette di gestire importi con 2 crt decimali
ENDIF
'$MenuActSiNo = NEW GestMenu
ME.Close
Form2.Text = "Inserimento Movimenti del : " & DtContGG.Text & " - " & DtContMM.Text & " - " & DtContAA.Text
Form2.Show
endif
ENDIF
END
Ciao.
Un paio di cose.
1) Nell'ultima release di Gambas, Benoit ha risolto
alcuni bug dei "*Focus" nei ComboBox. Allego un piccolo esempio
che con Gambas 2.13.1 funziona perfettamente con gb.qt, cioè premendo
alternativamente i pulsanti cambi il focus sui due ComboBox.
Se a te non funziona, c'è un bug nella tua versione di Gambas.
2) Se il mio esempio invece ti funziona, allora il baco potrebbe essere nel tuo codice.
Siccome spieghi che dipende dalla variabile $_Sw, ti consiglierei di mettere
qualcosa di più immediato per controllare se la variabile è letta bene.
IF $_Sw = "Erro" THEN
PRINT "blah blah erro"
DtContGG.SetFocus
ELSE
Se in console ti scrive "blah blah" vuol dire che non ci sono problemi con la variabile $_Sw.
Infine, per scrupolo, ho visto che nel commento del codice hai scritto "ERRO". "ERRO" non è uguale a "Erro". Detto per scrupolo, lo so che lo sai. Ciao.
giulio ha scritto:
........................
IF $_Sw = "Erro" THEN
PRINT "blah blah erro"
DtContGG.SetFocus
ELSE
Se in console ti scrive "blah blah" vuol dire che non ci sono problemi con la variabile $_Sw.
Infine, per scrupolo, ho visto che nel commento del codice hai scritto "ERRO". "ERRO" non è uguale a "Erro". Detto per scrupolo, lo so che lo sai. Ciao.
Francamente non ci capisco più niente! :-? :-?
In attesa di eventuali suggerimenti ho modificato il codice nel modo seguente:
PUBLIC SUB DtContOk_Click()
DIM $_Data AS String
DIM $MenuActSiNo AS GestMenu 'serve a richiamare la classe 'GestMenu'
DIM $TestData AS TestData 'serve a richiamare la classe 'TestData'
$_GGDtCont = DtContGG.Text
$_MMDtCont = DtContMM.Text
$_AADtCont = DtContAA.Text
$TestData = NEW TestData($_GGDtCont, $_MMDtCont, $_AADtCont) 'richiama la classe 'TestData'per verificare la validità formale della data contabile immessa
IF ModuliVari.b_VeroFalso = FALSE THEN
Message.ERROR("A T T E N Z I O N E !" & Chr(10) & "La data contabile immessa non é valida" & Chr(10) & "C O R R E G G I")
'ME.DtContGG_GotFocus()
DtContGG.SetFocus
ELSE
ME.VerifGGChiusa()
IF $_Sw <> "Erro" THEN
IF $_AADtCont < "2002" THEN
ModuliVari.$_TipoValuta = "£" 'permette di gestire importi senza crt decimali
ELSE
ModuliVari.$_TipoValuta = "€" 'permette di gestire importi con 2 crt decimali
ENDIF
'$MenuActSiNo = NEW GestMenu
ME.Close
'Message.Info("B_e_n_e__________________________!!!, la prova é riuscita" & Chr(10) & "Puoi aprire la Form di inserimento movimenti ")
Form2.Text = "Inserimento Movimenti del : " & DtContGG.Text & " - " & DtContMM.Text & " - " & DtContAA.Text
Form2.Show
ELSE
DtContGG.SetFocus
PRINT "blah blah erro"
ENDIF
ENDIF
END
Essenzialmente ho spostato alcune istruzioni in modo da potere testare $_Sw <> da "Erro". In queste condizioni il metodo SetFocus funziona, però viene eseguita pure
PRINT "blah blah erro"
che ho posto appositamente dopo l'istruzione SetFocus; per la verità m'aspettavo che non fosse eseguita.
Comunque la variabile $_Sw contiene effettivamente il valore "Erro", per cui non ha responsabilità.
Ho provato il programmino che gentilmente mi hai fornito, ma dato che gli eventi interessati per il cambio del Focus contengono solamente l'istruzione SetFocus, tutto funziona regolarmente.
Chiedo scusa per la svista nel commento del mio primo post relativamente ad "Erro", scritto "ERRO". É sempre dovuto allo status :fuso: che ho raggiunto sia per il SetFocus che rimaneva spento, sia per un altro ostacolo su un comando sql che mi sta letteralmente facendo impazzire.
Conclusione: Dopo avere modificato il codice l'istruzione SetFocus funzionicchia e ... guai a toccarla!
Dovrei installare l'ultima versione di Gambas, ma salvo assoluta necessità per ulteriori inconvenienti, preferisco rimandare ancora un pò.
Grazie e poi ancora grazie per l'aiuto a e la pasienzq di tutti. :ciao: