Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Запрет ввода в TextBox данных, кроме чисел


Автор: vdekameron 18.12.2014, 10:42
В VB нужно сделать запрет на ввод любых данных , кроме чисел. До этого пользовался IsNumeric. А сейчас не подходит, так как эта функция блокирует дробные числа, разделенные точкой, считая их не цифрой. А у меня в проекте для удобства пользователей дробные можно вводить с точкой или с запятой. Заранее спасибо!

Автор: Akina 18.12.2014, 11:48
Первый вопрос - когда выполняется проверка? при каждом изменении поля или только при потере фокуса?

Автор: vdekameron 18.12.2014, 12:23
Вводится значение в текстовое поле и когда нажимается на кнопку, идет проверка. Т.е. получается при потере фокуса

Автор: Akina 18.12.2014, 12:33
Ну так пишите в методе потери фокуса код валидации введённого значения. Если валидация не прошла - выбрасывайте сообщение и возвращайте фокус на поле ввода.
Валидация-то получается элементарная. Копируем введённый текст в переменную, заменяя запятую на точку (или наоборот - зависит от региональных установок). Проверяем переменную на Isnumeric. Всё.

Автор: vdekameron 18.12.2014, 13:24
Ой а можно для особо одаренных)) Дело в том что я с VB на вы и шепотом((( Поэтому эти все терпины-валидация и т.д. мне не знакомы((( Можно более простым языком пожалуйста

Автор: Akina 18.12.2014, 13:40
Ну типа
Код

Public GoodDelim As String
Public BadDelim As String

Sub Form_Load
GoodDelim = Mid(Cstr(1.1),2,1)
Select Case GoodDelim 
  Case "."
    BadDelim = ","
  Case ","
    BadDelim = "."
  Case Else
    MsgBox "Да тут ваще хрен поймёшь что!", vbOKOnly
    Unload Me
End Select
End Sub

Sub Text1_LostFocus
If Not IsNumeric(Replace(Text1.Text,BadDelim,GoodDelim)) Then 
  MsgBox "Вы ввели хрень!" & vbNewLine & "Извольте исправиться...", vbOKOnly
  Text1.SetFocus 
End If
End Sub


Автор: vdekameron 18.12.2014, 14:15
Объясните пожалуйста эти строчки:
Код

GoodDelim = Mid(Cstr(1.1),2,1)
If Not IsNumeric(Replace(Text1.Text,BadDelim,GoodDelim)) Then 


просто хочется понять смысл а не тупо копировать и вставлять

Автор: Akina 18.12.2014, 14:34
http://msdn.microsoft.com/en-us/library/aa263426(v=vs.60).aspx
http://msdn.microsoft.com/en-us/library/aa445073(v=vs.60).aspx
http://msdn.microsoft.com/en-us/library/aa242760(v=vs.60).aspx
http://msdn.microsoft.com/en-us/library/aa241892(v=vs.60).aspx
http://msdn.microsoft.com/en-us/library/aa445052(v=vs.60).aspx
http://msdn.microsoft.com/en-us/library/aa243382(v=vs.60).aspx

Автор: vdekameron 18.12.2014, 15:19
Что такое Isnumeric я знаю и уже разобрался с Mid. Что делает Cstr ??? не могу понять
Неужели все так сложно и нельзя допустим при нажатии на кнопку проверять что находится в текстовом поле((. Может можно обойтись без этих потерь фокусов

Автор: Akina 18.12.2014, 15:30
Цитата(vdekameron @  18.12.2014,  16:19 Найти цитируемый пост)
 Что делает Cstr ??? не могу понять

Первая из шести ссылок.

Автор: vdekameron 18.12.2014, 16:31
Сайт я не ленюсь прочитать. Англ. плохо знаю , пошел в настройки языка сайта, изменил на русский написали что данная страница не доступна на русском.
Написано что возвращает строковую переменную! Ну и что? я хочу понять смысл строки
Код

GoodDelim = Mid(Cstr(1.1),2,1)

Например при
Код

GoodDelim = "Я хочу выполнить проверку"
а=Mid(GoodDelim,3,4)
a="хочу"

Это я понял. Но что тут делает Cstr(1.1)
Сайт я не ленюсь прочитать. Англ. плохо знаю , пошел в настройки языка сайта, изменил на русский написали что данная страница не доступна на русском.

Автор: Akina 18.12.2014, 17:34
Цитата(vdekameron @  18.12.2014,  17:31 Найти цитируемый пост)
что тут делает Cstr(1.1)

Берёт ЧИСЛО 1.1 и преобразовывает его в СТРОКУ. При этом использует региональные настройки текущего пользовательского профиля.
А потом Mid берёт из результата 1 символ, начиная со 2-го символа получившейся строки. Что именно он берёт и нахрена - ну уж попробуй догадаться...

Автор: vdekameron 19.12.2014, 08:49
Akina,  Спасибо что не послали! И за потраченное время! Разобрался. Вот как бы я объяснил :- Cstr(1.1) показывает что 1.1 это строка, т.е. "1,1" , Соответственно Mid выбирает из 1,1 один символ, начиная со второго, т.е берет "," и присваивает это значение переменной GD(сокращенно). Затем делается выбор GD  При GD="," присваиваем переменной BD значение "." И замет когда Text1.text теряет фокус делаем проверку число ли там и тут же меняем точку на запятую.

У меня только 2 вопроса smile ) Опять чисто из интереса)))
1)В каком случае отработает ???
Код

 Case Else
    MsgBox "Да тут ваще хрен поймёшь что!", vbOKOnly

2)Почему бы ваш код не записать в таком виде, может я не прав, но мне кажется тогда мы просто избегаем этих выборов и лишних присвоений.
Код

Sub Text1_LostFocus()
If Not IsNumeric(Replace(Text1.Text, ".", ",")) Then
  MsgBox "Вы ввели хрень!" & vbNewLine & "Извольте исправиться...", vbOKOnly
  Text1.SetFocus
 End If
End Sub

Автор: Akina 19.12.2014, 08:54
Цитата(vdekameron @  19.12.2014,  09:49 Найти цитируемый пост)
В каком случае отработает ???

Это на случай непредусмотренной национальной кодировки. Вдруг найдётся умник, который в качестве разделителя влепит, например, символ доллара?

Цитата(vdekameron @  19.12.2014,  09:49 Найти цитируемый пост)
Почему бы ваш код не записать в таком виде

Представьте, что код попал на станцию, где установлена аглицкая национальная кодировка. 

Автор: vdekameron 19.12.2014, 09:34
Цитата(Akina @  19.12.2014,  08:54 Найти цитируемый пост)
Это на случай непредусмотренной национальной кодировки. Вдруг найдётся умник, который в качестве разделителя влепит, например, символ доллара?


Ну вы написали код на все случаи жизни))) smile  Ну а если взять во внимание что будет работать только на рускоязычных виндах, тогда все отработает по идее нормально

Автор: Akina 19.12.2014, 09:53
vdekameron, речь идёт о реакции программы на интерактивное взаимодействие с пользователем. А по сравнению с программой, даже если пальцы летают по клавиатуре, юзер - безнадёжнейший тормоз. И горсть лишнего кода (кстати, не такая уж и большая) на скорость работы никак не повлияет.
Зато появится уверенность, что если, допустим, шеф завтра припрётся со своим ноутом, на котором немецкая, скажем, винда - у программы всё равно проблем не возникнет.
Вот в расчётную часть я бы никаких дополнений не пихал.

Автор: vdekameron 19.12.2014, 10:22
Спасибо!

Автор: windcastle 4.2.2015, 22:10
Попробуй это!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)