Gambas-it

Gambas3 => Programmazione => Topic aperto da: Karl - 07 Febbraio 2019, 10:29:44

Titolo: [Risolto]controllo immissione dato in textbox
Inserito da: Karl - 07 Febbraio 2019, 10:29:44
buongiorno a tutti, non riesco a capire come controllare l'immissione di un dato numerico in un textbox  per evitare errori di inserimento (lettere invece che numeri)
Grazie
Titolo: Re:controllo immissione dato in textbox
Inserito da: Gianluigi - 07 Febbraio 2019, 11:52:37
Per non complicarti la vita, dovresti usare un ValueBox con la proprietà Type impostata su number (default) che è stato fatto proprio per questo uso.
Se ti occorre per soli numeri interi puoi anche usare un SpinBox impostando le proprietà min e max.
Altrimenti usa la ricerca scrivendo TextBox, se n'è parlato abbondantemente.
Titolo: Re:controllo immissione dato in textbox
Inserito da: cogier - 07 Febbraio 2019, 16:20:04
Prova questo: -

Codice: [Seleziona]
Public Sub TextBox1_Change()
Dim sNewText As String
Dim iChar As Integer

For iChar = 0 To Len(TextBox1.Text) - 1
  If IsNumber(TextBox1.Text[iChar]) Then sNewText &= TextBox1.Text[iChar]
Next

TextBox1.Text = sNewText

End
Titolo: Re:controllo immissione dato in textbox
Inserito da: Gianluigi - 07 Febbraio 2019, 16:29:07
Prova questo: -

Codice: [Seleziona]
Public Sub TextBox1_Change()
Dim sNewText As String
Dim iChar As Integer

For iChar = 0 To Len(TextBox1.Text) - 1
  If IsNumber(TextBox1.Text[iChar]) Then sNewText &= TextBox1.Text[iChar]
Next

TextBox1.Text = sNewText

End

Interessante, ma potrei inserire questa stringa:
Codice: [Seleziona]
,,,121,,34
che con ValueBox non potrei  :-\
Titolo: Re:controllo immissione dato in textbox
Inserito da: cogier - 07 Febbraio 2019, 17:03:35
OK,

Codice: [Seleziona]
Public Sub TextBox1_Change()
Dim sNewText As String
Dim iChar As Integer

For iChar = 0 To Len(TextBox1.Text) - 1
  If InStr("0123456789.", TextBox1.Text[iChar]) Then sNewText &= TextBox1.Text[iChar]
Next

TextBox1.Text = sNewText

End
Titolo: Re:controllo immissione dato in textbox
Inserito da: Gianluigi - 07 Febbraio 2019, 17:13:32
Non mi sono spiegato bene, in Italia i decimali si scrivono con la virgola:
Codice: [Seleziona]
1234,45
Il tuo codice però permette di scrivere numeri errati tipo:
Codice: [Seleziona]
,132,5,312,44,,,
Spero di aver chiarito

La stessa cosa accade anche se usi il punto.
Dovresti trovare il modo di far accettare alla TextBox solo numeri corretti.
Titolo: Re:controllo immissione dato in textbox
Inserito da: cogier - 07 Febbraio 2019, 17:27:41
OK,

Codice: [Seleziona]
Public Sub TextBox1_Change()
Dim sNewText As String
Dim iChar As Integer

For iChar = 0 To Len(TextBox1.Text) - 1
  If InStr(TextBox1.Text[0, iChar], ",") Then
    If InStr("0123456789", TextBox1.Text[iChar]) Then sNewText &= TextBox1.Text[iChar]
  Else
    If InStr("0123456789,", TextBox1.Text[iChar]) Then sNewText &= TextBox1.Text[iChar]
  End If
Next

TextBox1.Text = sNewText

End
Titolo: Re:controllo immissione dato in textbox
Inserito da: Gianluigi - 07 Febbraio 2019, 17:43:26
Se lo completi così ti eviti anche la prima virgola (,1234):
Codice: [Seleziona]
Public Sub TextBox1_Change()

  Dim s, sNewText As String
  Dim iChar As Integer

  s = TextBox1.Text
  If s[0] = "," Then
    TextBox1.Clear
    Return
  Endif
  For iChar = 0 To Len(TextBox1.Text) - 1
    If InStr(TextBox1.Text[0, iChar], ",") Then
      If InStr("0123456789", TextBox1.Text[iChar]) Then sNewText &= TextBox1.Text[iChar]
    Else
      If InStr("0123456789,", TextBox1.Text[iChar]) Then sNewText &= TextBox1.Text[iChar]
    End If
  Next

  TextBox1.Text = sNewText

End
Titolo: Re:controllo immissione dato in textbox
Inserito da: cogier - 07 Febbraio 2019, 18:15:33
Un po' meno codice: -

Codice: [Seleziona]
Public Sub TextBox1_Change()
Dim sNewText As String

If TextBox1.Text[0] = "," Then
  TextBox1.Clear
Else
  For iChar As Integer = 0 To Len(TextBox1.Text) - 1
    If InStr(TextBox1.Text[0, iChar], ",") Then
      If InStr("0123456789", TextBox1.Text[iChar]) Then sNewText &= TextBox1.Text[iChar]
    Else
      If InStr("0123456789,", TextBox1.Text[iChar]) Then sNewText &= TextBox1.Text[iChar]
    End If
  Next
  TextBox1.Text = sNewText
End If

End
Titolo: Re:controllo immissione dato in textbox
Inserito da: Gianluigi - 07 Febbraio 2019, 19:42:30
Ancora meno:
Codice: [Seleziona]
Public Sub TextBox1_Change()

  Dim sNewText As String
  Dim bChar As Boolean

  If TextBox1.Text[0] = "," Then
    TextBox1.Clear
  Else
    For i As Integer = 0 To Len(TextBox1.Text) - 1
      If TextBox1.Text[i] = "," And bChar Then Continue
      If TextBox1.Text[i] = "," Then bChar = True
      If IsNumber(TextBox1.Text[i]) Then sNewText &= TextBox1.Text[i]
    Next
  End If
  TextBox1.Text = sNewText

End
Titolo: Re:controllo immissione dato in textbox
Inserito da: cogier - 07 Febbraio 2019, 19:49:05
Non funziona con me. Non riesco a inserire una virgola, ma posso inserire '.'
123.................... OK  :o
Titolo: Re:controllo immissione dato in textbox
Inserito da: Gianluigi - 07 Febbraio 2019, 19:52:41
Perché noi usiamo la virgola e voi il punto.
A te non può funzionare se non cambi "," con "."
Questo vale anche per il tuo codice.

Ecco perché è meglio usare ValueBox  :)
Titolo: [risolto]:controllo immissione dato in textbox
Inserito da: Karl - 08 Febbraio 2019, 06:50:20
Grazie :ciao:
Titolo: Re:controllo immissione dato in textbox
Inserito da: Gianluigi - 08 Febbraio 2019, 14:33:40
A livello europeo si potrebbe risolvere così:
Codice: [Seleziona]
Private $sDec As String

Public Sub Form_Open()

  Print System.Language
  Select Case System.Language
    Case "sv_SE.UTF-8"
      $sDec = ":"
    Case "en_US.UTF-8", "C"
      $sDec = "."
  Case Else
    $sDec = ","
  End Select
  Print $sDec

End

Public Sub TextBox1_Change()

  Dim sNewText As String
  Dim bChar As Boolean

  If TextBox1.Text[0] = $sDec Then
    TextBox1.Clear
  Else
    For i As Integer = 0 To Len(TextBox1.Text) - 1
      If TextBox1.Text[i] = $sDec And bChar Then Continue
      If TextBox1.Text[i] = $sDec Then bChar = True
      If IsNumber(TextBox1.Text[i]) Then sNewText &= TextBox1.Text[i]
    Next
  End If
  TextBox1.Text = sNewText

End
C'è il problema della Svizzera che usa entrambi i separatori (virgola e/o punto) a seconda dei casi e li dipende a cosa è destinato il progetto.
Oppure si potrebbe dare la possibilità di scelta nelle preferenze...
Titolo: Re:controllo immissione dato in textbox
Inserito da: naderit - 08 Febbraio 2019, 21:24:46
Ciao .. solo numerio o solo lettere
Codice: [Seleziona]
Public Function Numeri()
 If Key.Code >= 48 And Key.Code <= 57 Then
   Else If key.Code = key.BackSpace Then
   Else If key.Code = key.Delete Then
   Else If Key.Code = Key.Left Then
   Else If Key.code = Key.Right Then
   Else If Key.Code = Key.Tab Then
    Else
      Stop Event
  End If
 End
 
Public Function Lettere()
  If Key.code >= 64 And Key.Code <= 90 Then
  Else If key.Code = key.BackSpace Then
  Else If key.Code = key.Up Then
  Else If Key.code = Key.Down Then
  Else
    Stop Event
  Endif
End
da richiamare con l'evento keypress .
per la virgola automatica:

Codice: [Seleziona]
Public Sub TextBox_Change()
If TextBox.text > "" Then
TextBox.text = Format(Replace(TextBox.Text, ",", Null) / 100, "0.00")  virgola in automatico inserimento euro
Endif 
End
Titolo: Re:controllo immissione dato in textbox
Inserito da: Gianluigi - 09 Febbraio 2019, 08:37:37
Ciao .. solo numerio o solo lettere
...
da richiamare con l'evento keypress .
per la virgola automatica:
...

 :mad: a me non funziona.
Potresti allegare un esempio?
Titolo: Re:controllo immissione dato in textbox
Inserito da: naderit - 10 Febbraio 2019, 11:27:17
certo.  :ciao:
Titolo: Re:controllo immissione dato in textbox
Inserito da: Gianluigi - 10 Febbraio 2019, 16:18:14
Si, capisco, ma mi sa che tu non abbia inquadrato bene il discorso che si stava facendo.  :-\

Comunque, come ho già detto, per i soli numeri (interi) esiste SpinBox e per la virgola messa dove vuoi (es. 1234,456789) esiste ValueBox che oltre a tutto mette la virgola o il punto in base alla localizzazione.
Tutto il resto è solo fuffa.