Private Sub Text1_KeyPress(KeyAscii As Integer)
If (KeyAscii < Asc("0")) Or (KeyAscii > Asc("9")) Then KeyAscii = 0
End Sub
If Not IsNumeric Then ...
А мы будем буфер обмена очищать при установке фокуса на текстбоксkeks-n писал(а):А если туды какой-нить умник скопипастит?
noob4ever писал(а):блокирует ввод в Text1, а надо чтобы просто буквы не песатались и все!
'This project needs a TextBox
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Const GWL_STYLE = (-16)
Const ES_NUMBER = &H2000&
Public Sub SetNumber(NumberText As TextBox, Flag As Boolean)
Dim curstyle As Long, newstyle As Long
'retrieve the window style
curstyle = GetWindowLong(NumberText.hwnd, GWL_STYLE)
If Flag Then
curstyle = curstyle Or ES_NUMBER
Else
curstyle = curstyle And (Not ES_NUMBER)
End If
'Set the new style
newstyle = SetWindowLong(NumberText.hwnd, GWL_STYLE, curstyle)
'refresh
NumberText.Refresh
End Sub
Private Sub Form_Load()
'KPD-Team 1999
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
SetNumber Text1, True
Me.Caption = "Now, try typing some letters into the textbox"
End Sub
'В модуле пишешь
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_NULL As Long = &H0
Global prevWnd As Long
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case 770
uMsg = WM_NULL
lParam = 0
wParam = 0
End Select
WindowProc = CallWindowProc(prevWnd, hwnd, uMsg, wParam, lParam)
End Function
'на форме текстбокс, в коде:
Private Sub Form_Load()
prevWnd = SetWindowLong(Text1.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Private Sub Text1_Change()
Dim i As Integer
Dim a() As String
Dim s As String
'Если нужно, чтобы поле очищалось, раскомментируй следующую строчку
'If Text1 = "" Then Exit Sub
If Text1 = "" Then Text1 = "0"
a = StrToArr(Text1)
For i = 0 To UBound(a)
If (a(i) < "0") Or (a(i) > "9") Then a(i) = ""
Next
s = ArrToStr(a)
If s <> Text1 Then Text1 = s
End Sub
Private Function StrToArr(ByVal s As String) As String()
Dim a() As String
ReDim a(Len(s) - 1)
For i = 0 To UBound(a)
a(i) = Mid(s, i + 1, 1)
Next
StrToArr = a()
End Function
Private Function ArrToStr(ByRef a() As String) As String
Dim s As String
For i = 0 To UBound(a)
s = s & a(i)
Next
ArrToStr = s
End Function
dim s1 as string, s2 as string
dim n as long
for n=1 to len(s1)
if asc(mid(s1,n,1))>=vbkey0 and asc(mid(s1,n,1))<=vbkey9 then s2=s2+ mid(s1,n,1)
next
keks-n писал(а):А если туды какой-нить умник скопипастит?
Andrey Fedorov писал(а):Пускай даже вводит выражение навроде 12+34/3 - программа должна вычислить и поместить результат выражения.
!Viper! писал(а):Заодно человек напишет парсер выражений...
noob4ever писал(а):а может кто знает код стрелочки, не той что "лево", а над Enter! чтобы символы удалять еще с конца можно было бы
Private Sub txtKolvo_Change()
Static oldText As String
Dim i As Integer
For i = 1 To Len(txtKolvo.Text)
If InStr("0123456789.", Mid$(txtKolvo.Text, i, 1)) = 0 Then
MsgBox "Напишите арабскими цифрами."
txtKolvo.Text = oldText
End If
Next i
If Val(txtKolvo.Text) > 200 Then
MsgBox "По-моему число слишком большое!"
txtKolvo.Text = oldText
Else
oldText = txtKolvo.Text
End If
End Sub
[root] писал(а):Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 48 To 57
Case Else
KeyAscii = 0
End Select
End Sub
' Отсечение недопустимых символов при вводе в поле
Public Sub CheckNumKeyPress(Value As Variant, KeyAscii As Integer, FieldType As ADODB.DataTypeEnum)
Select Case FieldType
' Контроль ввода целочисленных полей
Case adInteger, adSmallInt, adUnsignedTinyInt
Select Case KeyAscii
Case 48 To 57, Is < 32
Case 45
Case Else: KeyAscii = 0
End Select
' Контроль ввода полей с плавающей запятой
Case adCurrency, adDouble, adSingle, adNumeric
Select Case KeyAscii
Case 44, 46: KeyAscii = Asc(Format(0, "."))
Case 48 To 57, Is < 32
Case 45
Case Else: KeyAscii = 0
End Select
End Select
End Sub
Case 44, 46: KeyAscii = Asc(Format(0, "."))
Case 44, 46: KeyAscii = Asc(".")
VVitafresh писал(а):2 Andrey Fedorov Полезная процедурка, только не могу понять, зачем нужен первый параметр Value?
VVitafresh писал(а):Почему нельзя простро:
- Код: Выделить всё
Case 44, 46: KeyAscii = Asc(".")
Ведь в БД в качестве разделителя дробной части зачастую используется точка. А у тебя испольюзуются локальные настройки пользователя. Или я не прав?
VVitafresh писал(а):Вопрос CopyPaste, кроме как полным перебором символов, выходит так и не решается
Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 128