Anoniem: 106551 schreef op 23 maart 2004 @ 00:13:
Is het misschien niet handiger om de controle pas te doen bij het verlaten van het veld ( Onlostfocus ) ?
Dan hoef je alleen maar een isnumeric te gebruiken. Wil je alles namelijk afvangen in de OnChange, dan moet je met zoveel situaties rekening houden ( alleen cijfers, punten en mintekens, maximaal 1 punt, maximaal 1 minteken EN die moet vooraan staan etc. )
De mooiste oplossing is natuurlijk een gespecialiseerd component orvoor op de kop tikken, maar ik weet niet of die gratis te vinden zijn.
[edit] typo
Onder VB6 is het _Validate event daarvoor bedoeld.
Wat ik meestal gebruik is het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
| Private Sub Text1_Validate(Cancel As Boolean)
Text1.Text = ParseLong(Text1.Text, 0)
End Sub
Private Function ParseLong(vVal As String, Optional lDef As Long = 0) As Long
On Error GoTo errParse
ParseLong = CLng(vVal)
Exit Function
errParse:
ParseLong = lDef
End Function |
Dit gebruik ik in het geval ik een Long wil hebben (en als het fout gaat een optionele "default" waarde). Natuurlijk kun je ParseLong redelijk makkelijk omschrijven naar een currency bijvoorbeeld:
code:
1
2
3
4
5
6
7
| Private Function ParseCur(vVal As String, Optional cDef As Long = 0) As Currency
On Error GoTo errParse
ParseCur = CCur(vVal)
Exit Function
errParse:
ParseCur = cDef
End Function |
Andere functies mag je zelf maken, die zijn niet zo moeilijk.
Denk er wel aan dat als je bijvoorbeeld een default button hebt, dat je in het _click event effe me.validatecontrols aanroept om alle velden te valideren (anders komt het wel eens voor dat het validate event te laat wordt aangeroepen).
Tot slot nog een tipje: Als je
in het validate event Cancel op True zet op het moment dat er ongeldige data wordt aangetroffen blijft de focus op de betreffende textbox. Dit geldt natuurlijk voor een boel andere controls die een _validate event hebben ook.
Mijn uitgangspunt is dan ook meestal: Laat de gebruiker invoeren wat 'ie wil (met misschien alleen een .maxlength) en controleer pas NA de invoer of dit correct is. Er is niet zo irritant als dingen proberen te typen welke niet op je scherm (willen) verschijnen. Dat het "ongeldige" tekens zijn blijkt naderhand ook wel (en het programma laat tevens ook nog enige vorm van "intelligentie" zien door correcties uit te voeren waar mogelijk).
...En nog iets: Als je met currencies e.d. gaat werken, denk dan even aan LOCALES. In Nederland scheiden we decimalen met een komma en duizendtallen met een punt. Hoewel dit soms verwarrend is als je op een numeriek toetsenbord bezig bent, dien je dit correct af te handelen. Een mooi voorbeeldje is Excel, welke punten van het numerieke gedeelte automatisch (en dan dus wel
tijdens het typen...) vervangt. Denk eraan dat als je je applicatie Internationale-aware wil maken dat je dit soort geintjes goed afvangt. In de VS gebruiken ze namelijk weer wél een punt als decimaal scheidingsteken en een komma om de duizendtallen te scheiden. Ook dd-mm-jjjj or mm/dd/yyyy geintjes vallen daar onder. Mijn advies: Gebruik de CCur, CLng, CDate, CInt enzovoorts en ga niet prutsen met Val, Instr$, Mid$ en andere flauwekul. Laat het afhandelen door VB zelf.
Wil je
toch invoer blocken, probeer dan dit eens, lekker kort en krachtig:
code:
1
2
3
| Private Sub Text1_KeyPress(KeyAscii As Integer)
KeyAscii = IIf(InStr("0123456789", Chr(KeyAscii)), KeyAscii, 0)
End Sub |
En met een kleine uitbreiding heb je dit zo aangepast dat 'ie ook decimalen vreet e.d.:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| Private Sub Text1_KeyPress(KeyAscii As Integer)
KeyAscii = ValidKey(KeyAscii)
End Sub
Private Sub Text2_KeyPress(KeyAscii As Integer)
KeyAscii = ValidKey(KeyAscii, "abc")
End Sub
Private Sub Text3_KeyPress(KeyAscii As Integer)
KeyAscii = ValidKey(KeyAscii, "1234567890.-")
End Sub
Private Function ValidKey(KeyAscii As Integer, _
Optional strValidChars As String = "0123456789") As Integer
ValidKey = IIf(InStr(strValidChars, Chr(KeyAscii)), KeyAscii, 0)
End Function |
In dit voorbeeld kun je in text1 alleen 0 t/m 9 invoeren, in text2 alleen de letters a,b en c en in text 3 alle cijfers en een punt en een minus (denk aan negatieve getallen!)
Sim-pel
edit:
En om nog even terug te komen op FFrenzy: Hier ga je dus geen component voor downloaden he? Dit is makkelijk zelf te maken, waarom dan afhankelijk zijn van derden (met alle mogelijke bugs e.d. -die je dus niet zelf kunt fixen- van dien). Als het nou een complete grid was, of een mailcomponent, dan is het iets anders (hoewel ook een mailcomponent weinig moeite is), maar voor zo iets simpels ga ik geen OCX gebruiken (en distribueeren!)
[
Voor 30% gewijzigd door
RobIII op 23-03-2004 01:35
]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij