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ì:
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ì:
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!
L'argomento era già stato trattato tempo addietro sul forum.
Cmq io personalmente adotto questo codice per sostituire il "." con la virgola:
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:
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...
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:
(...)
Comodo = Trim(LAST.Text)
IF Len(comodo) = 0 THEN
RETURN
END IF
(...)