Autore Topic: metodo setfocus  (Letto 851 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
metodo setfocus
« il: 06 Giugno 2009, 12:41:32 »
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:
Codice: [Seleziona]
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:
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: metodo setfocus
« Risposta #1 il: 06 Giugno 2009, 13:30:12 »
prova così

Codice: [Seleziona]


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

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: metodo setfocus
« Risposta #2 il: 06 Giugno 2009, 15:24:40 »
@ fsurfing

ho provato la modifica che mi hai suggerito, ma solamente per vedere cosa succede, perché così si modifica la logica della if nidificata.

Tuttavia non cambia proprio niente; il programma prosegue nelle istruzioni successive senza sentire assolutamente la richiesta di SetFocus.
Comincio ad annusare cattivo odore, ... odore di bug! :-o:-o

Spero di sbagliarmi. Qualcuno ha già usato il metodo SetFocus sotto gb.qt? Se si, come ha risolto?   :freddo:

Ciao a tutti.
:ciao:

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: metodo setfocus
« Risposta #3 il: 06 Giugno 2009, 19:52:28 »
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.

Codice: [Seleziona]

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.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: metodo setfocus
« Risposta #4 il: 06 Giugno 2009, 22:28:03 »
Citazione

giulio ha scritto:
........................
Codice: [Seleziona]

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:
Codice: [Seleziona]
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
Citazione
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:
:ciao: