Textbox: только цифры

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
noob4ever
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 117
Зарегистрирован: 05.01.2006 (Чт) 0:58

Textbox: только цифры

Сообщение noob4ever » 09.01.2006 (Пн) 20:29

код потерялся, :(
как сделать???

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 09.01.2006 (Пн) 21:18

Код: Выделить всё
Private Sub Text1_KeyPress(KeyAscii As Integer)
    If (KeyAscii < Asc("0")) Or (KeyAscii > Asc("9")) Then KeyAscii = 0
End Sub
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Warn
Обычный пользователь
Обычный пользователь
 
Сообщения: 52
Зарегистрирован: 08.12.2005 (Чт) 20:34
Откуда: Питер

Сообщение Warn » 09.01.2006 (Пн) 21:47

Ещё можно так:
Код: Выделить всё
If Not IsNumeric Then ...

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 09.01.2006 (Пн) 21:56

Гы-гы :lol:
А если туды какой-нить умник скопипастит?
А по поводу IsNumeric то cтрока типа &H..... может прокатить, а челу надо тока цифры!
Надо ловить Change и проверять каждый символ выкидывая ненужные
Изображение

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 09.01.2006 (Пн) 22:16

keks-n писал(а):А если туды какой-нить умник скопипастит?
А мы будем буфер обмена очищать при установке фокуса на текстбокс :mrgreen:
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

noob4ever
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 117
Зарегистрирован: 05.01.2006 (Чт) 0:58

Сообщение noob4ever » 09.01.2006 (Пн) 22:35

Private Sub Text1_KeyPress(KeyAscii As Integer)
If (KeyAscii < Asc("0")) Or (KeyAscii > Asc("9")) Then KeyAscii = 0
End Sub
Нее такое не годится, оно блокирует ввод в Text1, а надо чтобы просто буквы не песатались и все!
эх был у меня код маленький такой, там еще паст не действовал)
и по типу в скобках еще перечислял какие симовлы можно вводить: (1,2,3,4,5,6,7,8,9,0) типа того.

noob4ever
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 117
Зарегистрирован: 05.01.2006 (Чт) 0:58

Сообщение noob4ever » 10.01.2006 (Вт) 0:23

Private Sub Текст1_KeyPress(KeyAscii As Integer)
Const Accept = "1234567890"
If Len(Replace(Accept, Chr(KeyAscii), "")) = Len(Accept) Then KeyAscii = 0
End Sub

пользуйтесь, нашел.
:D Кстати никто незнает как сделать чтобы нельзя было копировать в TextBox??

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 10.01.2006 (Вт) 0:31

Ну и что ты в итоге нашел? Оно же
noob4ever писал(а):блокирует ввод в Text1, а надо чтобы просто буквы не песатались и все!
:mrgreen: :mrgreen:
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 10.01.2006 (Вт) 3:00

А как же установка стиля ES_NUMERIC текстбоксу :roll:
Код: Выделить всё
'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
الفيجوال بيسك الرابح

noob4ever
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 117
Зарегистрирован: 05.01.2006 (Чт) 0:58

Сообщение noob4ever » 10.01.2006 (Вт) 4:04

но это не решает проблему с пастом

noob4ever
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 117
Зарегистрирован: 05.01.2006 (Чт) 0:58

Сообщение noob4ever » 10.01.2006 (Вт) 4:06

vvs_adm
и вправду :cry:

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 10.01.2006 (Вт) 11:09

Буфер обмена чистить НИЗЯ! Может юзеру надо n-значное число туды закопировать? И что, ему всё n знаков руками вводить? Или у него рисунок/файл/еще_что-нибудь в буфере лежит? И когда надо будет вставить у него этого в буфере ужо нету! А оригинальный документ пришилен (это если рисунок/что-нибудь)! Юзеру масса неудобств!!! Этого быть не должно.
Изображение

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 10.01.2006 (Вт) 11:41

Код: Выделить всё

'В модуле пишешь
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

Пользуйся :)
Последний раз редактировалось Kovu 10.01.2006 (Вт) 11:51, всего редактировалось 1 раз.
Если всё делать своими ручками, они скоро отвалятся !

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 10.01.2006 (Вт) 11:46

ОГО! Даже с распечаткой?? Круто!!!
#define ROFL 0xDDDD

mdx
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 169
Зарегистрирован: 06.01.2006 (Пт) 18:13
Откуда: I'm from Russia!

Сообщение mdx » 10.01.2006 (Вт) 12:08

Код: Выделить всё
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


По-моему всё делает правильно

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 10.01.2006 (Вт) 13:55

Правильно, конечно. Вот только код раза в три сократить можно...
Примерно так:

Код: Выделить всё
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

Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 10.01.2006 (Вт) 15:45

keks-n писал(а):А если туды какой-нить умник скопипастит?


А пущай - можно ведь в Validate проверить и ругнуться. Пускай туда вводит как запятую так и точку (программа должна разобраться и заменить на правильный разделитель).

Пускай даже вводит выражение навроде 12+34/3 - программа должна вычислить и поместить результат выражения.


:lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 10.01.2006 (Вт) 17:42

Andrey Fedorov писал(а):Пускай даже вводит выражение навроде 12+34/3 - программа должна вычислить и поместить результат выражения.


Заодно человек напишет парсер выражений...
Весь мир матрица, а мы в нем потоки байтов!

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 10.01.2006 (Вт) 17:44

!Viper! писал(а):Заодно человек напишет парсер выражений...


Нафиг маяться? ScriptControl на это есть.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

noob4ever
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 117
Зарегистрирован: 05.01.2006 (Чт) 0:58

Сообщение noob4ever » 10.01.2006 (Вт) 17:47

а может кто знает код стрелочки, не той что "лево", а над Enter! чтобы символы удалять еще с конца можно было бы

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 10.01.2006 (Вт) 17:49

noob4ever писал(а):а может кто знает код стрелочки, не той что "лево", а над Enter! чтобы символы удалять еще с конца можно было бы


Это чтоль: vbKeyBack ?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

noob4ever
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 117
Зарегистрирован: 05.01.2006 (Чт) 0:58

Сообщение noob4ever » 10.01.2006 (Вт) 20:14

да

[root]
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 10.01.2006 (Вт) 22:35
Откуда: http://bitstyle.narod.ru

А если вот так

Сообщение [root] » 10.01.2006 (Вт) 22:45

Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 48 To 57
Case Else
KeyAscii = 0
End Select
End Sub
БИТStyle - Энциклопедия компьютера и комплектующих
http://bitstyle.narod.ru

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 11.01.2006 (Ср) 0:30

Вот, правильно [root]! Вот так и надо учиться!
#define ROFL 0xDDDD

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.01.2006 (Ср) 4:57

Вот так универсально, тока проц чуть грузит :)
Код: Выделить всё
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
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: А если вот так

Сообщение Andrey Fedorov » 11.01.2006 (Ср) 8:17

[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
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 11.01.2006 (Ср) 15:35

2 Kovu Честно говоря твой код не работает (по крайней мере буквы спокойно вводятся)?

2 Andrey Fedorov Полезная процедурка, только не могу понять, зачем нужен первый параметр Value?
И еще. Поясни строку:
Код: Выделить всё

Case 44, 46: KeyAscii = Asc(Format(0, "."))

Почему нельзя простро:
Код: Выделить всё

Case 44, 46: KeyAscii = Asc(".")

Ведь в БД в качестве разделителя дробной части зачастую используется точка. А у тебя испольюзуются локальные настройки пользователя. Или я не прав?

Вопрос CopyPaste, кроме как полным перебором символов, выходит так и не решается :roll:

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 11.01.2006 (Ср) 15:56

VVitafresh
Дык ето это было дополнение для блокировки вставки :)
Если всё делать своими ручками, они скоро отвалятся !

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 11.01.2006 (Ср) 16:41

Тады понятно. Блокировка работает.
Я думаю, совместно с контролем KeyPress, напр. ф-ией Андрея Федорова (или подобной) -- это идеальный вариант.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.01.2006 (Ср) 17:04

VVitafresh писал(а):2 Andrey Fedorov Полезная процедурка, только не могу понять, зачем нужен первый параметр Value?


Убери. Я из какой-то старой процедурки этот код выдрал...

VVitafresh писал(а):Почему нельзя простро:
Код: Выделить всё
Case 44, 46: KeyAscii = Asc(".")

Ведь в БД в качестве разделителя дробной части зачастую используется точка. А у тебя испольюзуются локальные настройки пользователя. Или я не прав?


Прав. Ибо я не знаю что у него за разделитель точка или запятая.
Потому и подставляю то что надо для локали пользователя.
В идеале тут бы еще надо чуть поправить чтобы исключить случай когда точка или запятая может являться разделителем разрядов (тогда подмену делать нельзя). Но таких юзеров у меня просто небыло. Хотя счас у себя поправлю - благо оно не сложно и в одном месте...

VVitafresh писал(а):Вопрос CopyPaste, кроме как полным перебором символов, выходит так и не решается :roll:


Решается элементарной проверкой в событии Validate с соответствующей руганью. Кстати, там-же можно и на допустимый диапазон проверить...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 127

    TopList