30.01.2008, 06:56
общий
это ответ
Здравствуйте, CLov233!
Ответов много, добавлю свой.
Вариантов решения несколько.
Можно просто наплевать на то, что ввел пользователь, а перед использованием, значение поля "прогнать" через Val (не забывая, что Val принимает только (.) как разделитель):
<code>
Private Sub Command1_Click()
MsgBox Val(Replace(Text1, ",", "."))
End Sub
</code>
Можно просто информировать об ошибке и все.
Эти варианты не очень уважительно относятся к пользователю.
Есть неплохой, очень эффективный вариант, вообще запретить фокус ввода для поля, а весь ввод обрабатывать в обработчиках формы(KeyPreview=True), так сделано в калькуляторе Windows(calc.exe).
что-нибудь вроде:
<code>
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim t As String
Dim dec As String
t = Val(Text1)
dec = IIf(Right(Text1, 1) = ".", ".", "")
Select Case KeyCode
Case vbKey0 To vbKey9
t = t & dec & Chr(KeyCode)
Case vbKeyNumpad0 To vbKeyNumpad9
t = t & dec & Chr(KeyCode - 48)
Case vbKeyDelete
t = ""
Case vbKeyBack
If dec = "." Then
dec = ""
Else
t = Left(t, Len(t) - 1)
End If
End Select
Text1 = Val(t)
If KeyCode = vbKeyDecimal Then If dec = "" Then Text1 = Val(t) & "."
End Sub
</code>
таким образом, можно делать проверки любой сложности, перехватывать буфер обмена и т.д. и т.п.
этот вариант - мощный, но достаточно сложный для реализации.
Варианты попроще, те что уже озвучили, это проверять ввод в обработчиках поля.
OnKeyPress - очень удобный, простой, но не учитывает то, что из буфера обмена, значени можно вставлять не только нажимая Ctrl+V, а например с помощью мыши. В таком случае, данный вариант не сработает.
OnValidate - также удобный для нас, но проверка ввода происходит только в момент потери фокуса поля, что не очень удобно для пользователя.
OnChange - этот вариант еще не озвучили, но мне он нравится больше всего:
<code>
Private Sub Text1_Change()
Static OldVal As String
Dim ss As Long
Dim sl As Long
If Trim(Text1) = "" Then OldVal = "": Text1 = "": Exit Sub
If Not IsNumeric(Text1) Then
With Text1
ss = .SelStart
sl = .SelLength
.Text = OldVal
.SelStart = ss - 1
.SelLength = sl
End With
Else
OldVal = Text1
End If
End Sub
</code>
просто, удобно, не зависит от способа изменения данных, мне нравится.
Все эти способы можно комбинировать.
Вообщем, что хотел - сказал.
Успехов.