Autore Topic: Oggetto DateBox, controllo digitazione  (Letto 1607 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Oggetto DateBox, controllo digitazione
« il: 27 Novembre 2018, 10:03:55 »
Ho ripreso a programmare in Gambas e sono tornati i problemi di sempre:  come controllare la correttezza formale della digitazione della data, nel caso che l'oggetto sia "DateBox", prima di abbandonare completamente l'oggetto per passare ad un altro.
Il problema sorge soprattutto quando il passaggio da un oggetto all'altro sia gestito attraverso il mouse.
L'evento LostFocus si manifesta, ahimè, soltanto dopo che l'oggetto destinatario dell'ultima digitazione sia stato abbandonato. Risulta perciò tardivo e, riattivare, in caso di digitazione formalmente errata, il SetFocus sullo stesso diventa tremendamente difficoltoso (lo dico per esperienze passate).
Stavo pensando di sfruttare uno degli eventi disponibili per il mouse come MouseDown, MoseUP,  MouseMove, però mi sono chiesto: ma come fanno gli amici del forum Gambas?
Ripeto: lo scopo è quello di controllare, a digitazione conclusa, la sua correttezza prima che il Focus passi ad un altro oggetto, in modo da permetterne l'eventuale correzione, mentre, appunto, il Focus è ancora puntato sul DateBox corrente.
:ciao:

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Oggetto DateBox, controllo digitazione
« Risposta #1 il: 27 Novembre 2018, 11:47:30 »
A me sembra un non problema, occorre semplificare al massimo l'intervento del nostro codice sul comportamento della grafica.
Se, come succede ad esempio in DBSpeedyTest, dopo aver scritto la/le date devi agire su un widget (abitualmente un Button) il controllo dell'esattezza dei dati lo fai li e se qualcosa non va metti a Null il valore e gli dai il SetFocus cosa che io ho omesso perchè trattasi di mero esempio.
Va rimarcata una cosa, Gambas permette con pochi passaggi e un sapiente uso dei contenitori (Container) di creare finestre che si mostrano uguali in tutti i desktop.
Quindi per delle buone finestre occorrerebbe poco codice e giusta grafica.
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:Oggetto DateBox, controllo digitazione
« Risposta #2 il: 27 Novembre 2018, 15:25:29 »
A me sembra un non problema, occorre semplificare al massimo l'intervento del nostro codice sul comportamento della grafica.
Se, come succede ad esempio in DBSpeedyTest, dopo aver scritto la/le date devi agire su un widget (abitualmente un Button) il controllo dell'esattezza dei dati lo fai li e se qualcosa non va metti a Null il valore e gli dai il SetFocus
Benissimo, però, come avrai certamente capito quello del DateBox è solo un esempio; il problema si può presentare alla fine di una  digitazione qualsiasi all'interno  di una TextBox o di una TextArea o ancora diun a ComboBox, ...
Non sempre conviene operare come suggerisci tu, anche perchè, così facendo, vai ad alterare l'errata digitazione che invece deve essere mantenuta per permettere all'utente di vedere quello che ha sbagliato, in modo che possa apportare la correzione. Apponendo NULL infatti obblighi la ridigitazione completa del dato, con la possibilità di ripetere l'errore di prima.

La verità è che, secondo me, l'evento LostFocus dovrebbe essere scatenato in Gambas ancor prima che l'oggetto corrente perda il focus, esattamente come succede in Visual Basic. Ciò permetterebbe di operare un controllo a posteriori sulla digitazione appena ultimata, ancor prima che l'oggettio perda il Focus e, in caso di errori, mantenere il Foicus all'interno dell'oggetto corrente fino alla correzione formale del dato digitato.

Il disturbo appena citato che soffro da quando ho conosciuto Gambas, è secondo me un corto circuito del linguaggio vestito della sua parte grafica. Esso costituisce uno dei motivi per cui vorrei passare a scrivere con un altro strumento di programmazione, ma probabilmente sono ormai troppo vecchio per studiare ancora.
:ciao:

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Oggetto DateBox, controllo digitazione
« Risposta #3 il: 27 Novembre 2018, 16:14:43 »
Perdona ma Gambas è Gambas e non puoi pretendere che sia un'altra cosa.
Se vuoi programmare con Gambas devi farlo a modo suo.
Ad esempio quello che desideri lo puoi fare, con i dovuti accorgimenti, in questo modo:

Codice: [Seleziona]
Public Sub Form_Open()

  TextBox1.Text = "Un testo qualunque"

End

Public Sub Button1_Click()

  Dim s As String

  s = Left(TextBox1.Text, 8)
  If s <> "Una voce" Then
    Balloon.Delay = 1500
    Balloon("L'inserimento è sbagliato", TextBox1)
    TextBox1.SetFocus
    TextBox1.Select(0, 8)
    Return
  Endif
  Print "INSERIMENTO CORRETTO!"

End
« Ultima modifica: 27 Novembre 2018, 16:36:03 da Gianluigi »
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:Oggetto DateBox, controllo digitazione
« Risposta #4 il: 27 Novembre 2018, 17:42:38 »
Siccome ogni programmatore ha un suo stile proprio di scrivere codice, io ho preferito mantenermi nell'ambito dell'oggetto con la digitazione errata e, anche se l'evento LostFocus di Gambas mi fa acidità, ho agito così;
Codice: [Seleziona]
Public Sub DatIniz_LostFocus()
Dim TstDtDig As TestData

Dim $AA As String
Dim $GG As String
Dim $MM As String
Dim $Data As String
'------------------------------------------------------------------------------
  Debug "Evento 'DatIniz_LostFocus' - apertura" 
  $Data = DatIniz.value       'formato della data: MMggAAAA
  $GG = Mid($Data, 4, 2)
  $MM = Left($Data, 2)
  $AA = Mid($Data, 7, 4)
  $Data = Mid($Data, 7, 4) & Left($Data, 2) & Mid($Data, 4, 2)
  TstDtDig = New TestData($GG, $MM, $AA)              'Testa validità data e se data errata pone bSwVeFa = False
  If TstDtDig.bSwVeFa = False Then
                  Message.ERROR("<CENTER>data immessa ERRATA O INCOMPATIBILE <BR> <BR> ---  C O  R R E G G I  --- </CENTER>") '''
                  Stop Event
                  DatIniz.SetFocus
  Endif
Ho aggiunto uno Stop Event, allo scopo di annullare  il nuovo evento chiamato dal gestore eventi e permettere quindi di indirizzare il Focus di nuovo all'oggetto Datiniz.
E' superfluo?   Non lo so, ma non intralcia sicuramente.
Purtroppo il comando Set Focus posto nel metodo LostFocus, mi ha dato, in passato, non pochi supplizi.
Ho provato e funziona tutto benissimo.
 :D :ciao:
:ciao:

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re:Oggetto DateBox, controllo digitazione
« Risposta #5 il: 27 Novembre 2018, 18:25:30 »
Beh, se LostFocus ti provoca acidità, allora... :D

Sto diventando come Vuott. :D
In ogni caso non mi sembra una maniera sbagliata di gestire la cosa e se funziona... ;)
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Oggetto DateBox, controllo digitazione
« Risposta #6 il: 27 Novembre 2018, 19:01:40 »
Sto diventando come Vuott.

Ahéééé ! Allora ti servirà il bicarbonato di sodio !
« 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.244
  • Tonno verde
    • Mostra profilo
Re:Oggetto DateBox, controllo digitazione
« Risposta #7 il: 27 Novembre 2018, 19:19:32 »
Anche io sono d'accordo su quanto ha scritto Picavbg poc'anzi, non proprio su tutto ma sicuramente su questo:
Citazione
ogni programmatore ha un suo stile

 :D
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:Oggetto DateBox, controllo digitazione
« Risposta #8 il: 27 Novembre 2018, 23:40:58 »
Beh, se LostFocus ti provoca acidità, allora... :D

In ogni caso non mi sembra una maniera sbagliata di gestire la cosa e se funziona... ;)
Ahéééé ! Allora ti servirà il bicarbonato di sodio !
;D
Avete ragione, battute  più che  meritate.
 :2birre:

Comunque, la mia prova è andata a farsi ...

Guardate sia la form allegata che la sequenza degli eventi quando dopo l'inserimento di una data non corretta, clicco col mouse puntato sul pannello "Aggiorna Lista"
Citazione
Form11.DatIniz_GotFocus.294: Evento 'DatIniz_GotFocus' - apertura
Form11.AggiListPuls1_MouseUp.183: Evento AggiListPuls1_MouseUp
Form11.DatIniz_LostFocus.301: Evento 'DatIniz_LostFocus' - apertura
L'evento DatIniz_LostFocus viene schedulato dopo AggiListPuls1_MouseUp

Perciò sono ancora fermo sullo stesso punto.
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:Oggetto DateBox, controllo digitazione
« Risposta #9 il: 28 Novembre 2018, 09:58:38 »
< Ultime Notizieee <<<<
Ho sostituito il pannello "Aggiorna Lista" con un ButtonBox ed ho ripetuto l'esecuzione inserendovi anche le istruzioni di controllo sulla data, ciò in quanto l'oggetto DateBox permette di digitare solo numeri, ma non formattati come data. Il metodo di controllo data (DtIniFinLostFocus_mio) è stato chiamato dentro l'evento DatIniz_LostFocus che questa volta si è manifestato, correttamente, prima dell'evento PulsAggiList_MouseUp.
Ho però eliminato il comando Stop Event che non ha senso.
Citazione
Form11.DatIniz_GotFocus.270: Evento 'DatIniz_GotFocus' - apertura
Form11.DatIniz_LostFocus.277: Evento 'DatIniz_LostFocus' - apertura
Form11.DtIniFinLostFocus_mio.289: metodo 'DtIniFinLostFocus_mio' - apertura
Form11.PulsAggiList_MouseUp.323: Evento PulsAggiList_MouseUp - apertura
Form11.PulsAggiList_GotFocus.318: Evento PulsAggiList_GotFocus - apertura
Form11.DatIniz_GotFocus.270: Evento 'DatIniz_GotFocus' - apertura


Pare che ora funzioni tutto come desiderato, col cursore che si riposiziona all'inizio della casella DateBox.

@ Gianluigi
In effetti ho seguito la tua tecnica. Non ho selezionato il gruppo di caratteri errati perchè l'istruzione DateBox.Select mi ha dato errore, ma anche perchè ho segnalato l'errore con una finestra d'errore prima di restituire il Focus al DateBox di partenza. Penso però di migliorare il puntamento del cursore all'interno del DateBox, portandolo proprio sul primo gruppo di carattweri da correggere.
:ciao:

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re:Oggetto DateBox, controllo digitazione
« Risposta #10 il: 28 Novembre 2018, 20:55:53 »
A me sembra un non problema, occorre semplificare al massimo l'intervento del nostro codice sul comportamento della grafica. ...
Scusate l'intervento, vedo che ciclicamente sul Forum si aprono post sulla gestione delle date e gli oggetti a disposizione
per la loro gestione, premetto che nella mia poca esperienza con Gambas non ho mai avuto problemi a gestire le stesse
e gli oggetti di riferimento.
Picavbg, mi spieghi per quale motivo (solo per mia curiosità) usando una DateBox lasci libertà di digitazione della data
quando impostando la proprietà ReadOnly a True ti eviti gli errori formali e al massimo sbagli solo la data
intesa come periodo.
Va rimarcata una cosa, Gambas permette con pochi passaggi e un sapiente uso dei contenitori (Container) di creare finestre che si mostrano uguali in tutti i desktop.
Quindi per delle buone finestre occorrerebbe poco codice e giusta grafica.
Uno dei miei cruci da sempre, non ci sono mai riuscito, come il ridimensionamento quando si tratta di progetti composti non da una
semplice Form e con più oggetti contenuti, sarebbe interessante aprire una discussione ad hoc...
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Oggetto DateBox, controllo digitazione
« Risposta #11 il: 28 Novembre 2018, 22:53:51 »
... impostando la proprietà ReadOnly a True ti eviti gli errori formali e al massimo sbagli solo la data
intesa come periodo.
Concordo pienamente  :ok:
Citazione
Uno dei miei cruci da sempre, non ci sono mai riuscito, come il ridimensionamento quando si tratta di progetti composti non da una
semplice Form e con più oggetti contenuti, sarebbe interessante aprire una discussione ad hoc...

Concordo anche su questo, qui la discussione Finestra Gambas Perfetta con un allegato di base su cui iniziare a discutere.
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:Oggetto DateBox, controllo digitazione
« Risposta #12 il: 28 Novembre 2018, 23:36:06 »
Picavbg, mi spieghi per quale motivo (solo per mia curiosità) usando una DateBox lasci libertà di digitazione della data
quando impostando la proprietà ReadOnly a True ti eviti gli errori formali e al massimo sbagli solo la data
intesa come periodo.
L'oggetto stampa caricava nella ListBox tutte le date contabili presenti nella tabella riepilogativa delle giornate di registrazioni. Ciò comportava un inutile perdita tempo nel caricamento di tutte quelle date (oggi sono 9033). Ho pensato allora di caricare solamente quelle riguardanti l'ultimo anno.
Mi occorre perciò permettere un'eventuale ricerca di altri intervalli più antichi, per eventuali necessità occasionali. Ecco il motivo delle due DateBox.
Apponendo la proprietà "read only", ho soltanto la possibilità di aprire un piccolo calendario in cui andare a scorrere gli anni fino a trovare quello che mi interesserebbe, coi relativi giorno e mese. Mi pare molto più agevole e rapido digitare direttamente le date di inizio e fine periodo.
Tutto qua. Si tratta semplicemente di una scelta mia. Comunque oggi ho veramente superato il problema dei controlli col ritorno, in caso di data errata,  del SetFocus nella DateBox contenente l'errore, immediatamente dopo la digitazione errata.
Purtroppo Gambas gestisce gli eventi provocati dal mouse in maniera diversa rispetto a quelli provocati dall'uso della tastiera.
Spero di avere soddisfatto la tua curiosità.
:ciao:

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re:Oggetto DateBox, controllo digitazione
« Risposta #13 il: 29 Novembre 2018, 20:40:37 »
... Si tratta semplicemente di una scelta mia...
Certamente, non mi permetto di discuterla.
Come mi ha detto una volta il buon Gianluigi tuo il programma, tua la scelta di impostarlo
come ritieni più opportuno  :)
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)