Autore Topic: [Risolto]controllo immissione dato in textbox  (Letto 1641 volte)

Offline Karl

  • Gamberetto
  • *
  • Post: 35
  • l'è meij un dì da leun che cent'dì da pegura
    • Mostra profilo
[Risolto]controllo immissione dato in textbox
« il: 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
« Ultima modifica: 12 Febbraio 2019, 21:20:28 da Karl »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #1 il: 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.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline cogier

  • Gambero
  • **
  • Post: 57
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #2 il: 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

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #3 il: 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  :-\
« Ultima modifica: 07 Febbraio 2019, 16:29:44 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline cogier

  • Gambero
  • **
  • Post: 57
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #4 il: 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

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #5 il: 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.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline cogier

  • Gambero
  • **
  • Post: 57
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #6 il: 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

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #7 il: 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
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline cogier

  • Gambero
  • **
  • Post: 57
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #8 il: 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

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #9 il: 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
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline cogier

  • Gambero
  • **
  • Post: 57
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #10 il: 07 Febbraio 2019, 19:49:05 »
Non funziona con me. Non riesco a inserire una virgola, ma posso inserire '.'
123.................... OK  :o

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #11 il: 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  :)
« Ultima modifica: 07 Febbraio 2019, 19:54:01 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Karl

  • Gamberetto
  • *
  • Post: 35
  • l'è meij un dì da leun che cent'dì da pegura
    • Mostra profilo
[risolto]:controllo immissione dato in textbox
« Risposta #12 il: 08 Febbraio 2019, 06:50:20 »
Grazie :ciao:

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #13 il: 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...
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline naderit

  • Grande Gambero
  • ***
  • Post: 140
    • Mostra profilo
Re:controllo immissione dato in textbox
« Risposta #14 il: 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
« Ultima modifica: 08 Febbraio 2019, 21:35:42 da naderit »