Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - Input numeri con limite min e max
Forum - Visual Basic 6 - Input numeri con limite min e max

Avatar
gemini62 (Normal User)
Newbie


Messaggi: 3
Iscritto: 24/05/2010

Segnala al moderatore
Postato alle 11:21
Lunedì, 24/05/2010
Ciao a tutti,
premetto che ho già cercato sia qui nel forum che su web senza trovare esempi o discussioni sull'argomento.
Devo inserire valori numerici compresi in un range (ad esempio tra 2.5 e 28.7). Ho creato un semplice sub per controllare che i tasti premuti siano numerici, simbolo di meno, punto oppure virgola e backspace. E quindi fino qui nessun problema sia con MaskEdBox che con una normale TextBox.
Sono in difficoltà, invece, quando devo controllare "run time" (quindi in fase di digitazione) che il numero appena cliccato non mi faccia diventare il valore all'interno del campo superiore o inferiore ai limiti impostati. In questo caso vorrei poter lasciare invariato il numero nel campo, un pò quello che succede con l'evento KeyPress azzerando KeyAscii.

Mi scuso se non sono riuscito ad essere chiaro.
A tutti buona giornata

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:34
Lunedì, 24/05/2010
Ma non sarebbe piu' comodo un controllo a posteriori ?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
gemini62 (Normal User)
Newbie


Messaggi: 3
Iscritto: 24/05/2010

Segnala al moderatore
Postato alle 12:05
Lunedì, 24/05/2010
Testo quotato

Postato originariamente da nessuno:

Ma non sarebbe piu' comodo un controllo a posteriori ?




Ciao Nessuno,
sì, sarebbe certamente più semplice e comodo, magari con un banale msgbox di avvertimento.
I motivi per cui sto cercando di evitare scritte sono fondamentalmente due:
il primo è che si tratta di un programmino che, se deve avere delle scritte, queste devono essere in cirillico ma sappiamo che VB6 non gestisce i caratteri unicode :( , Per questo ho cercato di limitare al minimissimo indispensabile le scritte e quelle poche che compaiono sono in realtà delle immagini.
Inoltre questa è una modifica in un programma dove ci sono già diversi controlli che in base al loro contenuto o al loro settaggio, agiscono in automatico sulle funzioni enable e visible di altri oggetti e quindi, anche per questo caso, avrei voluto evitare messaggi.

Grazie.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:18
Lunedì, 24/05/2010
Ok ... allora posta il codice che hai gia' scritto e partiamo da quello aggiustandone tutti i malfunzionamenti ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
gemini62 (Normal User)
Newbie


Messaggi: 3
Iscritto: 24/05/2010

Segnala al moderatore
Postato alle 15:41
Lunedì, 24/05/2010
Grazie Nessuno,
ho fatto ulteriori modifiche ed ora sembra funzionare più o meno come avevo in mente. Scrivo comunque il codice per consentire vostre critiche e/o consigli per migliorare la procedura. Il codice riportato è relativo ad un controllo TextBox ma le stesse operazioni valgono anche per il controllo MaskEdBox.



Codice sorgente - presumibilmente VB.NET

  1. Dim OldCarica As Single
  2. Dim PercMax as Single
  3. Dim PercMin as Single
  4. 'A livello General viene dimensionata una variabile in cui si copierà il valore della 'TextBox prima di ogni premere di un tasto. Questa variabile conterrà quindi sempre 'l'ultimo valore utile e potrà così essere usata per aggiornare la TextBox se il suo 'valore dovesse uscire dal range impostato.
  5. 'Le variabili PercMax e PercMin saranno impostate con i valori limite del range (nel mio 'caso, vengono letti da un file)
  6.  
  7.  
  8. Private Sub txt_CaricaX100_KeyPress(KeyAscii As Integer)
  9. 'Prima di verificare la pressione di un nuovo tasto, e se nella TextBox c'è già un numero,
  10. 'viene salvato nella variabile di comodo OldCarica
  11.  
  12.     If IsNumeric(txt_CaricaX100.Text) Then
  13.         OldCarica = txt_CaricaX100.Text
  14.     End If
  15.  
  16. 'Il tasto premuto viene verificato nella Function NUMBERS_ONLY strutturata per accettare
  17. 'solo determinati valori
  18.  
  19.     KeyAscii = NUMBERS_ONLY(txt_CaricaX100.Text, KeyAscii, True, True, False)
  20. End Sub
  21.  
  22.  
  23. Private Sub txt_CaricaX100_Change()
  24. 'Dopo la pressione di un tasto, attraverso l'evento Change si verifica lo stato della 'TextBox. Se il tasto premuto non è stato azzerato viene controllato che:
  25.  
  26. '(1) il dato nella TextBox non inizi con la virgola, nel caso la tolgo altrimenti la
  27. 'riga di comando "If txt_CaricaX100.Text > PercMax Then" genera un errore
  28.  
  29.     If Left(txt_CaricaX100.Text, 1) = "," Then
  30.         txt_CaricaX100.Text = Mid(txt_CaricaX100.Text, 2)
  31.     End If
  32.  
  33. '(2) ci sia qualcosa nella TextBox altrimenti esce dalla subrutine.
  34.  
  35.     If txt_CaricaX100.Text = "" Then Exit Sub
  36.  
  37. '(3) il valore non sia superiore al valore massimo consentito. Se è maggiore alla TextBox
  38. 'viene riassegnato il valore salvato nella variabile di comodo OldCarica
  39.  
  40.     If (txt_CaricaX100.Text > PercMax) or (txt_CaricaX100.Text < PercMin) Then
  41.         txt_CaricaX100.Text = OldCarica
  42.         txt_CaricaX100.SelStart = Len(txt_CaricaX100.Text)
  43.     End If
  44.  
  45. End Sub
  46.  
  47. .
  48. .
  49. .
  50. .
  51. Public Function NUMBERS_ONLY(Value as String, KeyAscii As Integer, BkSpace As Boolean, Virgola As Boolean, Segno As Boolean) As Integer
  52.  
  53. If IsNumeric(Chr(KeyAscii)) Then
  54.     NUMBERS_ONLY = KeyAscii
  55.     Exit Function
  56. End If
  57.  
  58. If BkSpace = True And KeyAscii = 8 Then
  59.     NUMBERS_ONLY = KeyAscii
  60.     Exit Function
  61. End If
  62.  
  63. If Segno = True And KeyAscii = 45 Then
  64.      If InStr(Value, "-") = 0 Then
  65.         NUMBERS_ONLY = KeyAscii
  66.         Exit Function
  67.      End If
  68. End If
  69.  
  70. If Virgola = True And (KeyAscii = 44 Or KeyAscii = 46) Then
  71.      KeyAscii = 44
  72.      If InStr(Value, ",") = 0 Then
  73.         NUMBERS_ONLY = KeyAscii
  74.         Exit Function
  75.      End If
  76.  End If
  77.  
  78. NUMBERS_ONLY = 0
  79.  
  80. End Function



EDIT: il codice lo devi inserire tra i due tag [ code] codice [ /code]

Ultima modifica effettuata da GrG il 24/05/2010 alle 20:54
PM Quote