Autore Topic: Gestione messaggi  (Letto 3166 volte)

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Gestione messaggi
« Risposta #15 il: 23 Febbraio 2009, 15:28:07 »
@leo:
grafica ok, forse non avevo abilitato qualche componente...mah!!

Ora, come vi avevo detto precedentemente il codice seguente funziona perfettamente con le Qt (esclusi i messaggi), mentre con le Gtk ho dei problemi:

Codice: [Seleziona]

PUBLIC SUB TextBox1_LostFocus()
 DIM valore, valore2 AS String  
 DIM i AS Integer    

 valore = TextBox1.Text
 valore2 = ""
 FOR i = 1 TO Len(valore)
   SELECT CASE Mid(valore, i, 1)    
     CASE "0" TO "9"        
       valore2 &= Mid(valore, i, 1)      
     CASE ",", "."        
       valore2 &= ","      
     CASE ELSE
       valore2 &= ""    
   END SELECT  
 NEXT  
 IF TextBox1.Text <> "" THEN
   TextBox1.Text = Format(Val(valore2), "#0.00")  
 ENDIF    
 IF TextBox1.Text <> "" AND TextBox2.Text <> "" THEN
   TextBox2.SelectAll  
   TextBox1.SelectAll    
   Message.Warning("Dati non corretti.")
   TextBox2.SetFocus  
 ENDIF  
END

PUBLIC SUB TextBox1_KeyPress()
  SELECT Key.Code
    CASE Key.Enter, Key.BackSpace, Key.Delete, Key.Left,
         Key.Right, Key.space, Key.Tab
      RETURN
  END SELECT
 
  IF Key.Text LIKE "[0-9]" OR Key.Code = Key[","] OR Key.Code = key["."] THEN
     RETURN
    ELSE
     STOP EVENT
  ENDIF
END


Le differenze sono che:
non mi accetta ne il punto ne la virgola, di conseguenza non posso inserire decimali diversi dagli zeri che inserisce automaticamente se non digito decimali, se inserisco dati nella TextBox1 e nella 2 viene evidenziata solo la TextBox2 dopo la visualizzazione del messaggio...insomma qualche differenza c'è, non capisco  :-?
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Gestione messaggi
« Risposta #16 il: 23 Febbraio 2009, 16:46:53 »
Un'altra cosa strana, all'avvio del progetto nella console di Gambas appare questo messaggio:

(Progetto_Gtk:27651): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to      allocate widget with width -5 and height 0

qualcuno sa dirmi a cosa si riferisce?
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Gestione messaggi
« Risposta #17 il: 23 Febbraio 2009, 22:34:52 »
Tranquillo....lo fa pure a me con XFCE...lo fa sempre....

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Gestione messaggi
« Risposta #18 il: 24 Febbraio 2009, 00:52:01 »
Se togli l'evento TextBox1_KeyPress il codice funziona.
Secondo me hai realizzato un controllo _troppo_ rigido sulla digitazione, rallentando oltremodo l'esecuzione del programma.

Io metterei solo un evento TextBox1_Change per controllare l'eventuale inserimento del punto ed immediata sostituzione con la virgola:
Codice: [Seleziona]

IF Instr(TextBox1.Text, ".") THEN
  TextBox1.Text = Replace(TextBox1.Text, ".", ",")
ENDIF

e poi metterei l'evento LostFocus.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Gestione messaggi
« Risposta #19 il: 24 Febbraio 2009, 23:01:27 »
Funziona perfettamente, ma con il tuo esempio non posso impedire l'immissione di lettere e con l'evento _Change non riesco ad ottenere questo controllo.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Gestione messaggi
« Risposta #20 il: 25 Febbraio 2009, 11:29:16 »
Ma devi per _forza_ impedirlo? Non puoi semplicemente parsare con l'evento LostFocus e togliere tutte le lettere? Non è più semplice e meno costoso in termini di risorse?

Cmq, puoi usare l'evento KeyPress:
Codice: [Seleziona]

PUBLIC SUB TextBox1_KeyPress()
  SELECT CASE Chr$(Key.Code)
    CASE "a" TO "z", "A" TO "Z"
      STOP EVENT
    CASE ELSE

  END SELECT
 

END

Ovviamente affinalo secondo le tue esigenze.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Gestione messaggi
« Risposta #21 il: 25 Febbraio 2009, 11:56:41 »
In effetti, dovresti controllare tutti i caratteri al di fuori dei numeri, ma anche i tasti di controllo (tipo backspace, del, ins, ecc.).

Il controllo sulla pressione di un tasto, credo sia la soluzione migliore, ma è pur vero che bisogna controllare in modo accurato i caratteri in input.
Per quanto riguarda i numerici, se premetti i decimali, devi tenere conto che và analizzato tutto il testo del controllo, non solo se hai inserito il punto piuttosto che la virgola, perchè non sai dove è stato inserito. L'analisi và fatta sull'intera stringa, valutando se il valore immesso è valido ai fini sintattici; poi magari puoi controllarne il range e così via...

Riguardo ai codici di controllo (backspace, ins, del, frecce ecc.), vanno tenuti in considerazioni, perchè permettono il movimento e la modifica del dato; quindi, il filtro deve tenere conto di questo.

Da parte mia, ho evitato l'uso della ValueBox, a causa di alcune anomalie che ho riscontrato nell'uso, e sono ritornato alle semplici TextBox e, se necessario, applicando le routine di validazione a livello di pressione del tasto.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Gestione messaggi
« Risposta #22 il: 25 Febbraio 2009, 14:37:15 »
Anch'io non uso i ValueBox, mi affido alle TextBox e poi da codice ripulisco l'input dai caratteri sgraditi.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Gestione messaggi
« Risposta #23 il: 26 Febbraio 2009, 21:50:58 »
@leo:
E si, devo impedirlo per forza, visto che i campi che devo controllare nel mio progetto devono contenere delle cifre in euro quindi esclusivamente numeri, proprio tu mi avevi risposto in un'altra discussione facendomi presente che controlli nei tuoi progetti accuratamente l'input dell'utente, ciò è quello che voglio ottenere.
Anchio ho dovuto abbandonare le ValueBox perchè mi stavano complicando le cose, e sono tornato alle TextBox.

@md9327:
Io avevo già realizzato il codice che eseguiva i controlli che giustamente tu mi dici di tenere in considerazione (postato qualche pagina indietro in questa discussione) che controlla anche i tasti tipo backspace, del, ins, ecc... ma purtroppo come ho già detto con le Qt funzionava perfettamente (escluso il problema della proprietà _LostFocus) ma con le Gtk non funziona correttamente, e poi mi è venuto un'altro dubbio che mi ha posto una delle risposte di leo, mi fà presente che ho impostato un controllo troppo rigido con conseguente rallentamento dell'esecuzione del codice...insomma la confusione aumenta  :indeciso:  :fuso:  :eh:  :-?

A questo punto la domanda la pongo (spero non stupida) ma c'è ho non c'è differenza nell'usare Qt o Gtk?

Chiedo a voi due che ritengo le persone più preparate nelle questioni più "toste"
di chiarirmi le idee....grazie

P.S.: sono bene accetti anche i commenti degli altri partecipanti al forum.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Gestione messaggi
« Risposta #24 il: 27 Febbraio 2009, 10:07:04 »
La differenza tra gtk e qt c'è, non si può negare, e altrimenti non avrebbe senso avere due sistemi distinti e uguali... :-)
Il fatto che vengano switchate in automatico da Gambas, questo non vuol dire che le rende uguali.

Riguardo al controllo "tropo rigido", dipende sempre da quello che vuoi ottenere, e la sicurezza di ottenerlo sempre e comunque.
Adesso non mi sono andato a leggere a ritroso, tutti gli interventi di questa discussione, ma penso comunque ci sia un modo per ovviare al problema delle differenze tra i due sistemi, anche dietro al fatto che le logiche in questo caso non dovrebbero essere così distanti tra loro.
Ora non posso dimostrare con degli esempi, perchè non ho molto tempo, ma penso che il modo di risolvere ci sia.

Comunque, la pesantezza logica di un tale controllo, è anche dovuta all'approccio usato. E' ovvio pensare che, una piccola analisi di l'accettazione di un determinato codice, non è da considerarsi certamente pesante; il problema si verifica quando si inizia a giocare con le stringhe, nel tuo caso il controllo di numeri con decimali, su cui bisogna analizzare se il formato totale è corretto (non solo verificare se l'input è un numero e un separatore decimale), verificare se risponde ad un determinato requisito di validità, ecc. Analizzare il contenuto della textbox, ogni volta che si preme qualcosa sulla tastiera, diventa ovviamente pedante e oneroso, oltre che i tempi di risposta dipendono dalle dimensioni delle stringhe.
Un uso delle espressioni regolari, potrebbe velocizzare la procedura di analisi, ma non sò ora se l'implementazione di questa libreria in gambas sia veloce, dovresti provare...

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Gestione messaggi
« Risposta #25 il: 27 Febbraio 2009, 11:45:53 »
@Tornu:
sì, controllo accuratamente l'input. Però devi sempre fare un rapporto fra quanto ti costa questa cosa e cosa ottieni. Filtrare le lettere, come hai visto, non è difficile. Però se devi controllare per bene in fase di digitazione se ciò che è stato inserito è un numero oppure no diventa complicato (se l'utente ti inserisce 12,23,56 che numero è? 12,23? 23,56? 12,56? Insomma, meglio fare un bel Risultato = Val(...) nell'evento LostFocus :-P).

@Luigi:
Anch'io avevo pensato alle espressioni regolari ma la documentazione è un po' scarna (strano, vero?) e non le conosco assolutamente. Servirebbe un buon programmatore Perl ;-)
Visita il mio sito personale: http://www.leonardomiliani.com

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Gestione messaggi
« Risposta #26 il: 27 Febbraio 2009, 23:55:46 »
Vi ringrazio per le vostre risposte e delucidazioni tecniche.
A livello di codice ho trovato una soluzione che mi permette di avere il controllo totale sull'input da parte dell'utente evitando anche l'eventuale digitazione prospettata da leo (se l'utente ti inserisce 12,23,56 che numero è? 12,23? 23,56? 12,56), la formattazione automatica dei decimali (max due, sia che vengano digitati oppure no), la sola possibilità di inserire numeri, l'utilizzo dei tasti backspace, del, ecc...

Non so se la soluzione che ho utilizzato sia tecnicamente valida (aspetto eventuali commenti) ma di più non sono riuscito ad inventarmi con le mie conoscenze attuali.

Codice: [Seleziona]

PUBLIC SUB TextBox1_KeyPress()
 IF Key.Text LIKE "[^0-9.,]" AND Asc(Key.Text) > 31 THEN
  STOP EVENT
    ELSE IF Key.Text LIKE "." AND InStr(TextBox1.Text, ".") THEN
    ELSE IF Key.Text LIKE "," AND InStr(TextBox1.Text, ",") THEN    
   STOP EVENT
 ENDIF
END

PUBLIC SUB TextBox1_LostFocus()
 DIM valore, valore2 AS String
 DIM i AS Integer    

 valore = TextBox1.Text  
 valore2 = ""  
 FOR i = 1 TO Len(valore)
  SELECT CASE Mid(valore, i, 1)
    CASE "0" TO "9"        
      valore2 &= Mid(valore, i, 1)
    CASE ",", "."        
      valore2 &= ","      
    CASE ELSE
      valore2 &= ""
   END SELECT
 NEXT
 IF TextBox1.Text <> "" THEN
   TextBox1.Text = Format(Val(valore2), "#0.00")
 ENDIF  
 IF TextBox1.Text <> "" AND TextBox2.Text <> "" THEN                      
   TextBox2.SelectAll
   TextBox1.SelectAll
   Message.Warning("Dati non corretti.")
   TextBox2.SetFocus
 ENDIF
 CATCH
   Balloon.Info("Caratteri non validi.", TextBox1)
END


Sono a completo digiuno sulle espressioni regolari.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Gestione messaggi
« Risposta #27 il: 28 Febbraio 2009, 00:59:19 »
Bè, hai già inserito qualcosa del genere, e comunque la cosa è da testare...

Da qualche parte ho una paginetta con i codici delle regexp, devo trovarla, ma in ogni caso internet può essere una buona alternativa... :-)

Se la trovo la pubblico.

Bye

Ops... eccola qua...

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Gestione messaggi
« Risposta #28 il: 28 Febbraio 2009, 01:37:21 »
Scusate non si potrebbe mettere da qualche parte un codice rapido si controllo sulla textbox per i numeri che sia a disposizione di tutti facile facile da copiare?

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Gestione messaggi
« Risposta #29 il: 28 Febbraio 2009, 10:11:29 »
C'è l'area download apposta per questo ;-)
Ha una sezione denominata "Classi" in  "Codice Gambas" in cui si possono inserire classi o comunque codice di interesse comune. E' cura dell'autore proporla in tale sezione.
Visita il mio sito personale: http://www.leonardomiliani.com