Как при вводе в TextBox отсечь ненужные символы?

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

Как при вводе в TextBox отсечь ненужные символы?

Сообщение Alkoch » 04.12.2004 (Сб) 15:44

Задача: надо, чтобы при вводе в textbox программа автоматически пропускала только цифры и запятые, а остальные символы игнорировала? Помогите, пожалуйста.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.12.2004 (Сб) 15:48

Код: Выделить всё
Private Sub Text1_KeyPress(KeyAscii As Integer)
  Select Case KeyAscii
  Case vbKey0 To vbKey9, vbKeyDecimal
  Case Else
    KeyAscii = 0
  End Select
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Alkoch
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 18.11.2002 (Пн) 18:20

Сообщение Alkoch » 04.12.2004 (Сб) 17:18

Спасибо, работает, но пропускает только цифры и почему-то символ n, запятую не пропускает. Помогите еще раз, пожалуйста

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 04.12.2004 (Сб) 17:46

Эта обработка должна быть в событии KeyDown(). Ну и еще тебе придется пропускать некоторые клавиши, типа Backspace (vbKeyBack) и Delete (не помню :( )...

Alkoch
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 18.11.2002 (Пн) 18:20

Сообщение Alkoch » 04.12.2004 (Сб) 17:57

Пожалуйста, поподробнее и желательно с примером, если, конечно, можно

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 04.12.2004 (Сб) 18:04

Н-да... Че-то у меня KeyDown() отказался в среде работать. Странно...
Код: Выделить всё
Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case Chr$(KeyAscii)
  Case "0" To "9", ".", ","
    ' nothing to do
  Case Else
    KeyAscii = 0
End Select
End Sub

Видимо, все-таки вот так...

Alkoch
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 18.11.2002 (Пн) 18:20

Сообщение Alkoch » 04.12.2004 (Сб) 18:20

Спасибо! Работает!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.12.2004 (Вс) 18:14

GSerg писал(а):
Код: Выделить всё
Private Sub Text1_KeyPress(KeyAscii As Integer)
  Select Case KeyAscii
  Case vbKey0 To vbKey9, vbKeyDecimal
  Case Else
    KeyAscii = 0
  End Select
End Sub

А не путаешь ASCII и VKEY-коды?
В параметре передаётся ASCII-код, а ты сравниваешь с VKEY-константой...
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.12.2004 (Вс) 18:17

Ennor писал(а):
Код: Выделить всё
Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case Chr$(KeyAscii)
  Case "0" To "9", ".", ","
    ' nothing to do
  Case Else
    KeyAscii = 0
End Select
End Sub

Видимо, все-таки вот так...

Не спорю, что так читается лучше, но гораздо эффективнее было бы делать Case по самому KeyAscii, чтобы избежать 4:!: строковых сравнений для каждой нажатой кнопки.
Изображение

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 05.12.2004 (Вс) 18:27

Господа, так намного проще, имхо. Я всегда делаю так:
Код: Выделить всё
Private Sub Text1_KeyPress(KeyAscii As Integer)
  If (InStr(1, "1234567890," & Chr(8), Chr(KeyAscii))) = 0 Then KeyAscii = 0
End Sub

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.12.2004 (Вс) 18:37

Самый эффективный метод - с Case-ом по KeyAscii.
Но если процессор такой мощный, что нечем его занять - тогда можно делать как угодно. Например, так: (inspired by Ruslan Demidow)
Код: Выделить всё
Private Sub Text1_KeyPress(KeyAscii As Integer)
Const Accept = "1234567890,"
  If Len(Replace(Accept, Chr(KeyAscii), "")) = Len(Accept) Then KeyAscii = 0
End Sub


Квадратик в коде - это и есть Chr(8); прекрасно работает ;-)
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 06.12.2004 (Пн) 12:18

tyomitch писал(а):...
Не спорю, что так читается лучше, но гораздо эффективнее было бы делать Case по самому KeyAscii, чтобы избежать 4:!: строковых сравнений для каждой нажатой кнопки.

Согласись, что моей целью было не только, чтобы это работало, но и чтобы это было понятно :) . Кроме того, как ты понимаешь, для написания промышленного кода, даже в таких объемах, нужно чуть больше, чем 5 минут...


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

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

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

    TopList  
cron