Autore Topic: Trattino in TextBox + gestione virgola  (Letto 2187 volte)

Offline stef

  • Grande Gambero
  • ***
  • Post: 144
    • Mostra profilo
    • http://www.altabrianza.org
Trattino in TextBox + gestione virgola
« il: 21 Aprile 2009, 23:18:39 »
Ciao a tutti, sto impazzendo probabilmente per una banalità.

Vi spiego il problema: ho una serie di TextBox e vorrei che, quando il controllo TextBox perde il focus (evento LostFocus), il programma facesse un controllo; se rileva che è stato digitato un numero, lascia tutto così com'è, se invece il campo è stato lasciato in bianco o sono stati inseriti dei caratteri che non rappresentano un numero Float, deve mettere un trattino ("-").

Sto provando così:

Codice: [Seleziona]
PUBLIC SUB TextBox1_LostFocus()
'controlla che i caratteri immessi siano numeri, altrimenti metti un trattino "-"
  IF IsNumber(TextBox1.Text) = FALSE THEN
  TextBox1.Text = "-"
  END IF
END


o anche così:

Codice: [Seleziona]
PUBLIC SUB TextBox2_LostFocus()
'controlla che i caratteri immessi siano numeri, altrimenti metti un trattino "-"
  IF NOT IsNumber(TextBox2.Text) THEN
  TextBox2.Text = "-"
  END IF
END


ma non funziona...come devo fare?
(Ah, per come è fatto il programma e l'algoritmo che ci sta dietro, non posso sostituire i TextBox con i ValueBox)

Inoltre, già che ci sono, visto che il programma accetta sia valori interi che di tipo Float, vorrei anche che al posto del puntino eventualmente digitato dall'utente per la separazione dei decimali. venisse utilizzata la classica virgola, anche se l'utente immette il punto. In VB6 si poteva fare, si può anche in Gambas?

Grazie mille e scusate l'ignoranza!
Ciao!

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Trattino in TextBox + gestione virgola
« Risposta #1 il: 21 Aprile 2009, 23:40:21 »
L'argomento era già stato trattato tempo addietro sul forum.
Cmq io personalmente adotto questo codice per sostituire il "." con la virgola:
Codice: [Seleziona]

PUBLIC SUB TextBox1_Change()

  IF InStr(TextBox1.Text, ".") THEN
    TextBox1.Text = Replace$(TextBox1.Text, ".", ",")
  END IF  

END

Ricordati però che Gambas (come tutti i linguaggi) adotta internamente la separazione decimale internazionale, che è il "." e non la virgola come in Italia, per cui in fase di calcolo devi risostituire la virgola con il punto, altrimenti non torna nulla.

Per il controllo numerico del campo ed il relativo filtraggio, uso invece questo (arzigogolato) codice, che cerca di tener presente di tutte le situazioni:
Codice: [Seleziona]

PUBLIC SUB TextBox1_LostFocus()
DIM Aiuto AS Integer
DIM Comodo, Comodo2, Comodo3 AS String
DIM Importo AS Single

  Comodo = Trim(TextBox1.Text)
  IF Len(comodo) = 0 THEN
    RETURN
  END IF
  comodo = Replace$(comodo, " ", "")
  Comodo = Replace$(Comodo, ",", ".")
  Comodo3 = ""
  FOR aiuto = 1 TO Len(comodo)
    comodo2 = ""
    SELECT CASE Mid(comodo, aiuto, 1)
      CASE "0" TO "9"
        Comodo2 = Mid(comodo, aiuto, 1)
      CASE "-"
        Comodo2 = "-"
      CASE "."
        Comodo2 = "."
      CASE ELSE
        Comodo2 = ""
    END SELECT
    Comodo3 = Comodo3 & Comodo2
  NEXT
  IF Len(comodo3) < 1 THEN
    TextBox1.text = ""
    RETURN
  END IF
  IF IsNumber(CSng(comodo3)) = FALSE THEN
    TextBox1.Text = ""
    RETURN
  END IF
  Aiuto = InStr(comodo3, ".")
  IF aiuto = 0 THEN
    comodo3 = comodo3 & ".00"
  ELSE
    Comodo2 = Mid(comodo3, aiuto + 1)
    IF Len(comodo2) > 2 THEN
      comodo2 = Left(comodo2, 2)
    ELSE IF Len(comodo2) < 2 THEN
      comodo2 = comodo2 & String(2 - Len(comodo2), "0")
    END IF
    comodo3 = Left(comodo3, aiuto) & comodo2
  END IF
  importo = CSng(Comodo3)
  TextBox1.Text = Format(importo, "-##,###,##0.00")
END

Cosa fa?
1) toglie tutti gli spazi;
2) risostituisce la "," con il "." come separatore decimale;
3) preleva dal campo solo i numeri, il "." e l'eventuale segno meno (numeri negativi);
4) se non c'è il punto lo inserisce e mette 2 zeri in fondo alla stringa (questo perché quel codice converte in valuta, per cui come regola deve essere sempre specificata anche la parte decimale. Tu puoi considerare l'assenza del punto come l'inserimento di un intero e la presenza di esso come inserimento di un numero in virgola mobile). Se c'è il punto, prende solo 2 decimali (se sono di meno, aggiunge uno zero).
5) alla fine, formatta il risultato per essere uguale ad una valuta.

Il codice è abbastanza semplice e lo puoi adattare alle tue esigenze. Miglioralo, perché io lo scrissi tempo fa e non l'ho più controllato: è brutto da vedersi...
Visita il mio sito personale: http://www.leonardomiliani.com

Offline stef

  • Grande Gambero
  • ***
  • Post: 144
    • Mostra profilo
    • http://www.altabrianza.org
Re: Trattino in TextBox + gestione virgola
« Risposta #2 il: 22 Aprile 2009, 14:33:19 »
Grazie mille per la risposta, sei stato gentilissimo! :2birre:

Il codice funziona perfettamente, proverò magari a snellirlo se possibile, visto che devo inserirlo in parecchi TextBox (ben 62!) e oltre che pesante per la CPU è anche noiso da inserire...a proposito, non esiste un modo per evitare di scriverlo 62 volte? (scusa se approffitto della tua gentilezza, ma è un po' un suicidio!)

Ciao! :ciao:

  • Visitatore
Re: Trattino in TextBox + gestione virgola
« Risposta #3 il: 22 Aprile 2009, 23:35:25 »
Ehhh tu vuoi bruciare le tappe ....
Bisogna impostare tutte le textbox con il medesimo "group" ..... poi invece del nome "textbox1" usi LAST (ultimo oggetto usato,leggi un pò la guida)....

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Trattino in TextBox + gestione virgola
« Risposta #4 il: 22 Aprile 2009, 23:36:14 »
Certo che c'è (così come c'era la risposta nei vecchi post... cercare ;-))

Devi, in fase di creazione dei TextBox, impostare per tutti la proprietà Group con lo stesso nome. Quando poi vai a scrivere il codice per l'evento Click di un qualunque textbox vedrai che ti apparirà non più il nome del widget seguito dal nome dell'evento (es.: TextBox1_Click) ma il nome del gruppo (es.: GruppoPulsanti_Click).
A questo punto recuperi il TextBox che ha generato l'evento usando la parola chiave LAST. Il codice diventa ad esempio:
Codice: [Seleziona]

(...)
Comodo = Trim(LAST.Text)
  IF Len(comodo) = 0 THEN
    RETURN
  END IF
(...)
Visita il mio sito personale: http://www.leonardomiliani.com

Offline stef

  • Grande Gambero
  • ***
  • Post: 144
    • Mostra profilo
    • http://www.altabrianza.org
Re: Trattino in TextBox + gestione virgola
« Risposta #5 il: 23 Aprile 2009, 21:57:09 »
Accidenti, ma è fantastico questo linguaggio di programmazione! :2birre:  :si:
Grazie mille per l'aiuto e scusatemi...la prossima volta prima di fare delle domande cercherò bene nel forum...anzi, per scusarmi metterò i ringraziamenti pubblici a questa Community nella finestra "Informazioni" del programma opensource che sto creando. ;-)  :amici:

Ciao!

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Trattino in TextBox + gestione virgola
« Risposta #6 il: 02 Maggio 2009, 13:10:12 »
Citazione

@ Leo
mi permetto di inserimi in questa discussione perché il codice di esempio che hai gentilmente riportato e che ho trovato utilissimo per il supporto di conoscenza ed esperienza forniti, termina con due importantissime istruzioni che permettono di editare l'importo digitato nel "Textbox".

leo72 ha scritto:
Codice: [Seleziona]

............................
  importo = CSng(Comodo3)
  TextBox1.Text = Format(importo, "-##,###,##0.00")
END


Allora, con gli strumenti che Gambas offre e con la mia esperienza conoscitiva, tendente a zero, ho cercato di ottenere un risultato molto prossimo al tuo; dico molto prossimo perché non ho considerato gli spazzi eventualmente presenti nel Textbox, e ciò in quanto dentro la proprietà KeyPress, filtro i crt <> dai numeri e dalla virgola decimale, pertanto ho fiducia che non possono essere immessi crt "spazio"; ho dovuto inoltre dichiarae il campo importo "as float" perché con "as single" ottenevo un troncamento strano; ho scartato l'uso del "-" nella maschera di editing perché i miei dati "valuta" non vanno mai in negativo.

Premesso tutto ciò, sono riuscito alla fine ad ottenere il mio valore importo editato, solo che al posto dei punti separatori delle migliaia, mi sono ritrovato spazi. Per rendere meglio l'idea di quanto citato, allego il modulo di trattamento dell'importo da editare; vi sono ripoprtati anche i valori raggiunti dopo l'istruzione "Format" e prima del "RETURN" al controllo chiamante.

Inotre riporto qui di seguito il codice inserito dentro l'evento "LostFocus, nel quale é richiamato il modulo per l'editing:
Codice: [Seleziona]

PUBLIC SUB ImpMovDig_LostFocus()
   DIM i_Intero AS Integer
   DIM i_Decimale AS Integer
   DIM i_LunStri AS Integer
   DIM $_MaskImp AS String

   IF $_TypVal = "€" THEN
          $_MaskImp = "###,###,##0.00"
   ELSE
     $_MaskImp = "###,###,##0"
   ENDIF
   $_StriMia = ImpMovDig.Text
   $_StriMia = Modulivari.EditImp($_StriMia, $_MaskImp)
   ImpMovDig.Text = $_StriMia
 END


Non capisco l'errore commesso, mi puoi aiutare? :oops:

 :ciao:
:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Trattino in TextBox + gestione virgola
« Risposta #7 il: 02 Maggio 2009, 23:12:45 »
Il problema da te riscontrato è comune a molti: dipende dalla localizzazione utilizzata dal sistema e dall'integrazione di Gambas con essa.

Su Ubuntu sono certo che al posto dei punti come separatori decimali vengono usati spazi, ma non so se è un problema legato a questa particolare distro oppure al desktop Gnome.
Tempo fa segnalai la cosa e, in tutta risposta, ebbi solo qualche info che si potevano riassumere in "ricontrolla le tue impostazioni", come se Gambas fosse a posto... Secondo me il fatto che Benoit sviluppi prevalentemente su Mandriva/KDE fa emergere spesso questi problemi di integrazione fra i 2 desktop manager (Gnome e KDE, appunto).
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Trattino in TextBox + gestione virgola
« Risposta #8 il: 03 Maggio 2009, 23:33:02 »
@ Leo

Grazie; comunque, per risolvere l'inaspettato inconveniente, dopo avere eseguito il comando format, ho aggiunto il seguente codice:
Citazione
$_Impor = Replace$($_Impor, " ", ".")   'completa l'editing coi punti divisori delle migliaia

per maggiore chiarezza riporto tutto il codice scritto per l'editing:
Codice: [Seleziona]
$_Impor = Replace$($_Impor, ",", ".")   'rimette il punto decimale al posto della virgola
S_Import = CFloat($_Impor)
$_Impor = Format(S_Import, $_Mask)
$_Impor = Replace$($_Impor, " ", ".")   'completa l'editing coi punti divisori delle migliaia

 :-)
E tutto é andato a posto.
:ciao:  :ciao:
:ciao: