Запрет ввода символов

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

Запрет ввода символов

Сообщение Alexey-VB » 30.10.2006 (Пн) 11:05

Есть задача в TextBox сделать запрет на ввод ненужных символов.
например я сделал так:

Private Sub TextBox_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 48 Or KeyCode = 49 Or KeyCode = 50 Or KeyCode = 51 Or KeyCode = 52 Or KeyCode = 53 Or KeyCode = 54 Or KeyCode = 55 Or KeyCode = 56 Or KeyCode = 57 Or KeyCode = 8 Or KeyCode = 13 Then
Else
PushButton = MsgBox("You cannot enter letters! ", 16, " Warning")
TextBox = ""
End If
End Sub

Все работает кроме одного. Я немогу сделать разрешение на ввод "." и ","
Я в вставляю KeyCode = 46 (это соответствует "."), а VB игнорирует этот символ.

Что я не так сделал? И существуют ли другие способы запрета ввода символов?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 30.10.2006 (Пн) 11:18

Во первых, надо, обрабатывать keyup а не keydown - потому что это идеологически неверно, ибо для человека ощущение введенного с клавиатуры символа возникает в момент, отпускания клавиши.

а во вторых - в самом деле, надо бы по хрошему поулчать раскладку клавиатуры и мапить символы, в соответствии с ней. Иначе, на разных локалях могут быть траблы.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 30.10.2006 (Пн) 11:18

Код: Выделить всё
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 48 Or KeyAscii = 49 Or KeyAscii = 50 Or KeyAscii = 51 Or KeyAscii = 52 Or KeyAscii = 53 Or KeyAscii = 54 Or KeyAscii = 55 Or KeyAscii = 56 Or KeyAscii = 57 Or KeyAscii = 8 Or KeyAscii = 13 Or _
    KeyAscii = 44 Or KeyAscii = 46 Then
    KeyAscii = 0
End If
End Sub


RayShade, пожалуй, это слишком сложно ;)
Последний раз редактировалось Amed 30.10.2006 (Пн) 11:20, всего редактировалось 1 раз.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.10.2006 (Пн) 11:20

RayShade писал(а):Во первых, надо, обрабатывать keyup а не keydown - потому что это идеологически неверно

Не так.
Человек ожидает реакции при нажатии, а не отпускании.
Не говоря уж о том, что KeyUp не повторяется при длительном нажатии, а KeyDown повторяется.
Lasciate ogni speranza, voi ch'entrate.

Alexey-VB
Обычный пользователь
Обычный пользователь
 
Сообщения: 61
Зарегистрирован: 11.08.2006 (Пт) 15:10

Сообщение Alexey-VB » 30.10.2006 (Пн) 11:27

Как "мапить символы" с клавиатуры?

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 30.10.2006 (Пн) 12:19

Amed писал(а):
Код: Выделить всё
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 48 Or KeyAscii = 49 Or KeyAscii = 50 Or KeyAscii = 51 Or KeyAscii = 52 Or KeyAscii = 53 Or KeyAscii = 54 Or KeyAscii = 55 Or KeyAscii = 56 Or KeyAscii = 57 Or KeyAscii = 8 Or KeyAscii = 13 Or _
    KeyAscii = 44 Or KeyAscii = 46 Then
    KeyAscii = 0
End If
End Sub

Ай-яй-яй :)
Код: Выделить всё
Private Sub Text1_KeyPress(KeyAscii As Integer)
  Select Case KeyAscii
    Case 8, 13, 44, 46, 48 To 57: KeyAscii = 0
  End Select
End Sub

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 30.10.2006 (Пн) 12:29

alibek

Человек ожидает реакции, при отпускании клавиши :)

Потому что, для него - завершение действия это, отпущенная клавиша.

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 30.10.2006 (Пн) 13:33

RayShade
Ты же не ждешь, что появится символ во время отпускания клавиши? Ты ждешь, что он появится, когда ты ее нажмешь...
Подпись находится в стадии разработки...

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 30.10.2006 (Пн) 13:46

RayShade писал(а):Человек ожидает реакции, при отпускании клавиши :)


Хм... Я думаю наоборот. Человек ждет реакции от нажатия кнопки (клавиша - тоже своего рода кнопка), а не от ее отпускания.

Нажми на кнопку - получишь результат. © группа "Технология" :)

Потому что, для него - завершение действия это, отпущенная клавиша.


А если человек не хочет завершать действие, он не должен отпускать кнопку :P

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 30.10.2006 (Пн) 13:54

Конь

lister

Спор бессмысленен. Возьмите, и попробуйте получить MSGBOX в тот момент как у вас палец на нажатой кнопке.

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 30.10.2006 (Пн) 14:52

RayShade
Согласен. Но все же появление символа ожидается во время нажатия кнопки;)
Подпись находится в стадии разработки...

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 30.10.2006 (Пн) 15:19

Конь

Нет. Во время ее отпускания. Проверь ;)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.10.2006 (Пн) 15:48

В действительности, же, символы в текстбоксе появляются во время нажатия. Многие действия происходят именно по дауну кнопки. Исключением является разве что WinKey
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 30.10.2006 (Пн) 16:07

RayShade
Не знаю, как у тебя... Но я слежу только за тем, как нажимаю, но никак не как отпускаю :D
Вобщем... лучше пусть автор делает, как ему удобно;)
Подпись находится в стадии разработки...

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 30.10.2006 (Пн) 16:20

RayShade писал(а):Конь
Нет. Во время ее отпускания. Проверь ;)

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

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
  Label1.Tag = CLng(Label1.Tag) + 1
  Label1.Caption = " Кейдауны: " & Label1.Tag
End Sub

Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
  Label2.Tag = CLng(Label2.Tag) + 1
  Label2.Caption = " Кейапы: " & Label2.Tag
End Sub

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 30.10.2006 (Пн) 16:50

RayShade писал(а):Конь
Нет. Во время ее отпускания. Проверь ;)


Я проверил. Во время ее нажатия ;)

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 30.10.2006 (Пн) 17:31

lister

Ты не то проверил. Я говорил про ожидание

А не про появление.

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 30.10.2006 (Пн) 18:01

аааа... понятно :)
тогда согласен

|( () ( T |/| |(
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 211
Зарегистрирован: 01.10.2005 (Сб) 15:49

Сообщение |( () ( T |/| |( » 30.10.2006 (Пн) 21:42

Вот ещё способ:

Код: Выделить всё
Private Sub Text1_KeyPress(KeyAscii As Integer)
If InStr("\/:*?<>|" + Chr(34), Chr(KeyAscii)) <> 0 Then KeyAscii = 0
End Sub
С=[::::::::::> ™ e398wallpapers.narod.ru

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 30.10.2006 (Пн) 21:45

По моему легче всего так

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

Private Const numbers As String = "1234567890"
Private Sub Text2_KeyPress(keyascii As Integer)
If InStr(1, numbers & Chr(8), Chr(keyascii), vbTextCompare) = 0 Then keyascii = 0
End Sub


сдесь можно вводить только цифры. Ставишь в константу нужные символу и вперед.

Если надо отследить не нужные, то пиши

InStr(1, numbers , Chr(keyascii), vbTextCompare)>0 then ...
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 30.10.2006 (Пн) 22:59

Разрешить цифры в текстовом поле и запретить остальное лучше так:
Код: Выделить всё
SetWindowLong( Text1.hWnd, GWL_STYLE, GetWindowLong( Text1.hWnd, GWL_STYLE ) Or ES_NUMBER )


В случае ввода нецифры винда выдаст звуковое и визуальное предупреждение

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

Сообщение Kovu » 30.10.2006 (Пн) 23:02

Неа, а вдруг пользователю дробное значение ввести надо =)
Если всё делать своими ручками, они скоро отвалятся !

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 30.10.2006 (Пн) 23:08

если вводятся только цифры


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 130

    TopList