Oppure

Loading
24/05/10 9:21
gemini62
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
aaa
24/05/10 9:34
Ma non sarebbe piu' comodo un controllo a posteriori ?
24/05/10 10:05
gemini62
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.
aaa
24/05/10 11:18
Ok ... allora posta il codice che hai gia' scritto e partiamo da quello aggiustandone tutti i malfunzionamenti ...
24/05/10 13:41
gemini62
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.



Dim OldCarica As Single
Dim PercMax as Single
Dim PercMin as Single
'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.
'Le variabili PercMax e PercMin saranno impostate con i valori limite del range (nel mio 'caso, vengono letti da un file)


Private Sub txt_CaricaX100_KeyPress(KeyAscii As Integer)
'Prima di verificare la pressione di un nuovo tasto, e se nella TextBox c'è già un numero,
'viene salvato nella variabile di comodo OldCarica 

    If IsNumeric(txt_CaricaX100.Text) Then
        OldCarica = txt_CaricaX100.Text
    End If

'Il tasto premuto viene verificato nella Function NUMBERS_ONLY strutturata per accettare 
'solo determinati valori

    KeyAscii = NUMBERS_ONLY(txt_CaricaX100.Text, KeyAscii, True, True, False)
End Sub


Private Sub txt_CaricaX100_Change()
'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:

'(1) il dato nella TextBox non inizi con la virgola, nel caso la tolgo altrimenti la
'riga di comando "If txt_CaricaX100.Text > PercMax Then" genera un errore

    If Left(txt_CaricaX100.Text, 1) = "," Then
        txt_CaricaX100.Text = Mid(txt_CaricaX100.Text, 2)
    End If

'(2) ci sia qualcosa nella TextBox altrimenti esce dalla subrutine.

    If txt_CaricaX100.Text = "" Then Exit Sub

'(3) il valore non sia superiore al valore massimo consentito. Se è maggiore alla TextBox
'viene riassegnato il valore salvato nella variabile di comodo OldCarica

    If (txt_CaricaX100.Text > PercMax) or (txt_CaricaX100.Text < PercMin) Then
        txt_CaricaX100.Text = OldCarica
        txt_CaricaX100.SelStart = Len(txt_CaricaX100.Text)
    End If

End Sub

.
.
.
.
Public Function NUMBERS_ONLY(Value as String, KeyAscii As Integer, BkSpace As Boolean, Virgola As Boolean, Segno As Boolean) As Integer

If IsNumeric(Chr(KeyAscii)) Then
    NUMBERS_ONLY = KeyAscii 
    Exit Function
End If

If BkSpace = True And KeyAscii = 8 Then
    NUMBERS_ONLY = KeyAscii 
    Exit Function
End If

If Segno = True And KeyAscii = 45 Then
     If InStr(Value, "-") = 0 Then
        NUMBERS_ONLY = KeyAscii 
        Exit Function
     End If
End If

If Virgola = True And (KeyAscii = 44 Or KeyAscii = 46) Then
     KeyAscii = 44
     If InStr(Value, ",") = 0 Then
        NUMBERS_ONLY = KeyAscii 
        Exit Function
     End If
 End If

NUMBERS_ONLY = 0

End Function



EDIT: il codice lo devi inserire tra i due tag [ code] codice [ /code]
Ultima modifica effettuata da GrG 24/05/10 18:54
aaa