Hallo Zwackel,
Du kannst auch dies probieren.
Ist (zugegeben) "etwas" aufwendiger, aber
- fängt u.a. fehlerhafte Eingaben (copy & paste) ab (normiert die Zeit)
- formatiert
- lässt keine 6-9 als dmin zu
- fehlerhafte Eingabe von "." oder "," wird korrigiert
Private Sub Text1_KeyPress(KeyAscii As Integer)
Check_TimeInp KeyAscii, Text1
End Sub
Private Sub Text1_Validate(Cancel As Boolean)
' Beim Verlassen formatieren
Check_TimeInp 13, Text1
End Sub
Public Sub Check_TimeInp(KeyAscii As Integer, cTBox As TextBox)
'
' TimeInpTest testet die Eingabe in die TextBox cTBox, die als Control
' übergeben wird.
' Es werden folgende Eingaben zugelassen:
'
' 2 Stellen vor dem Komma: hh
' 2 Stellen nach dem Komma: mm
' nur Zahlen, ":", BackSpace, Return
' an der dmin-Stelle werden nur Zahlen 0-5 zugelassen!
'
'
Dim kPos As Long
Dim lVork As Long
Dim dTime As Double
'
cTBox.MaxLength = 5
'
If KeyAscii = Asc(".") Then KeyAscii = Asc(":")
If KeyAscii = Asc(",") Then KeyAscii = Asc(":")
'
If cTBox.SelLength = Len(cTBox) Then cTBox = vbNullString ' Wenn alles
' markiert, löschen
'
kPos = cTBox.SelStart
cTBox = Replace(cTBox, ",", ":") 'falsche Trenner ersetzen
cTBox = Replace(cTBox, ".", ":")
cTBox.SelStart = kPos
'
kPos = InStr(1, cTBox, ":")
'
If kPos <> 0 And KeyAscii = Asc(":") Then
'kein 2. ":"
KeyAscii = 0
'
ElseIf KeyAscii = Asc(":") And Len(cTBox) = 0 Then
' 0 einfügen
KeyAscii = 0
cTBox = "0:"
cTBox.SelStart = 2
'
Else
'
Select Case KeyAscii
'
Case 8
' Backspace erlaubt
'
Case 13
' bei Return Formatieren:
'Bei direktem Return in cTBox funktioniert es nur, wenn es auf der
' Form KEIN StandardCommand gibt.
'Mit StandardCommand erfolgt auch kein Validate von cTBox
'wg möglichem Copy + Paste etwas aufwendiger
dTime = Abs(Val(Replace(Replace(cTBox.text, ":", "."), ",", ".")))
'Zeit normieren (0:60 in 1:00 etc):
dTime = Int(dTime) + ((dTime - Int(dTime)) * 100 / 60)
dTime = Round(dTime, 9)
dTime = Int(dTime) + ((dTime - Int(dTime)) * 60 / 100)
cTBox.text = Replace(Replace(Format(dTime, "00.00"), ",", ":"), ".", _
":") 'doppeltes Replace wg "." oder "," als DecTrenner
cTBox.SelStart = Len(cTBox)
'kein Signal(wenn kein StandardCommand):
KeyAscii = 0
'
Case Asc("0") To Asc("9"), Asc(":")
'
If (kPos <> 0 And kPos > cTBox.SelStart) Or _
kPos = 0 Then
'Vorkomma
If kPos = 0 Then
lVork = Len(cTBox) + 1 '+1(das neue Zeichen)
Else
lVork = kPos '- 1+1 = -1(Komma)+1(das neue Zeichen)
End If
'
If lVork = 2 And Len(cTBox) = 1 Then
'
If KeyAscii = Asc(":") Then
cTBox = cTBox & Chr(KeyAscii)
Else
cTBox = cTBox & Chr(KeyAscii) & ":"
End If
cTBox.SelStart = 3
KeyAscii = 0
'
ElseIf lVork >= 3 Then
' als 3.Zeichen nur ":" zulassen
Select Case KeyAscii
'
Case Asc(":")
'
Case Else
KeyAscii = 0
End Select
End If
ElseIf kPos <> 0 And kPos = cTBox.SelStart Then
'1.Nachkomma
Select Case KeyAscii
'
Case Asc("0") To Asc("5")
'
Case Else
KeyAscii = 0
End Select
ElseIf kPos <> 0 And kPos + 1 = cTBox.SelStart Then
'2.Nachkomma
Else
'3.Nachkomma
KeyAscii = 0
End If
'
Case Else
KeyAscii = 0
'
End Select
'
End If
'
End Sub |