Название: Вопрос по контролю ввода с помощью VBScript.RegExp Отправлено: Muskin2029 от 01.07.2020, 14:17:19 Всем привет!
На форме имеется несколько полей TextBox для ввода чисел. Конкретно - в поле t_OffsetY ввод контролируется так: Код: (vb) Private Sub t_OffsetX_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)При отсутствии начального значения в t_OffsetX (пустое поле) всё отрабатывается нормально. При заданном начальном значении поля t_OffsetX и при переходе на это поле по Tab поле выделяется и необходимо нажать Backspace, чтобы произвести ввод. Что необходимо добавить именно в .Pattern, чтобы не использовать Backspace, т.е. выделение затиралось бы при вводе (-) и/или чисел? Название: Re:Вопрос по контролю ввода с помощью VBScript.RegExp Отправлено: Дмитрий Щербаков(The_Prist) от 01.07.2020, 14:39:57 Если честно - ничего не понял. Почему нельзя использовать событие KeyDown для определения кода клавиши? И причем здесь вообще RegExp, если хотите что-то затирать клавишей?
Можете как-то иначе попробовать пояснить задачу? Название: Re:Вопрос по контролю ввода с помощью VBScript.RegExp Отправлено: Muskin2029 от 01.07.2020, 15:11:52 Попытаюсь попроще описать.
В поле t_OffsetX должно вводиться значение от 0 до 99, может быть со знаком -. Это же поле t_OffsetX имеет начальное значение 20. Если перейти на это поле по Tab, число 20 выделяется, ввод по шаблону "^[-]?[1-9]?[0-9]?$" невозможен, пока не затереть это выделение. Почему RegExp? - да просто удобно и коротко. Название: Re:Вопрос по контролю ввода с помощью VBScript.RegExp Отправлено: Дмитрий Щербаков(The_Prist) от 01.07.2020, 16:00:15 имеет начальное значение 20 А зачем оно нужно, если его надо затирать в итоге? Я не очень понимаю все равно манипуляции. Почему просто не запретить ввод ненужного и оставить только ввод по шаблону? Например, так:Код: (vb) Private Sub t_OffsetX_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Название: Re:Вопрос по контролю ввода с помощью VBScript.RegExp Отправлено: Muskin2029 от 01.07.2020, 17:37:11 А зачем оно нужно, если его надо затирать в итоге? Я не очень понимаю все равно манипуляции. В поле t_OffsetX указано начальное значение, например, 20.С предыдущего поля по Tab перескакиваем на t_OffsetX, число 20 полностью выделяется. Если по каким-то условиям его менять не нужно - жмём Tab и перескакиваем на следующее поле. Но если 20 нужно изменить, выделение нужно затереть, чтобы ввести в соответствие с шаблоном новое число. Так как избежать этого затирания (BackSpace)? Если не использовать RegExp (обычный ввод без контроля), то при переходе на t_OffsetX при наборе первого же символа выделение затирается автоматически. Название: Re:Вопрос по контролю ввода с помощью VBScript.RegExp Отправлено: Дмитрий Щербаков(The_Prist) от 01.07.2020, 18:48:07 Так как избежать этого затирания Никак. И уж точно не при помощи RegExp. Какая разница используете Вы его или нет - если в событии Вы не предотвращаете нажатие клавиши BackSpace, то и действие её тоже нельзя предотвратить. Я изначально написал - для отслеживания нажатия клавиш используйте KeyDown. Ну вроде того:Код: (vb) Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) а что в итоге надо я все равно не понял, уж извините. Вы можете забыть про RegExp и написать каким видите правильное поведение при переходе Tab-ом на текстбокс и вводе без BackSpace и с ним данных? P.S. Вы мой-то код пробовали? Ему вообще фиолетово как Вы там вводите - затирая сначала или нет, все обрабатывается по шаблону правильно. Название: Re:Вопрос по контролю ввода с помощью VBScript.RegExp Отправлено: Muskin2029 от 01.07.2020, 19:24:28 P.S. Вы мой-то код пробовали? Ну да, его и буду использовать.Ему вообще фиолетово как Вы там вводите - затирая сначала или нет, все обрабатывается по шаблону правильно. У меня почему-то не фиолетово - при выделенном поле шаблон не срабатывает, приходится всё-таки затирать.Обнаружил ещё одну неприятность. Допустим, перепрыгиваю на это поле, там стоит число 20, выделенное. Стрелкой влево иду в начало числа, чтобы поставить минус - шаблон не срабатывает, тут уже приходится использовать Delete и всё-равно очищать всё поле. Придётся, наверно, действительно использовать _KeyDown, хотя If-ов и по прибавится. Название: Re:Вопрос по контролю ввода с помощью VBScript.RegExp Отправлено: Дмитрий Щербаков(The_Prist) от 01.07.2020, 19:42:16 Стрелкой влево иду в начало числа, чтобы поставить минус - шаблон не срабатывает логично. Вы же всегда ПОСЛЕ текста добавляете новый вводимый символ:TextBox2.Value & Chr(KeyAscii) Вам надо обрабатывать определение позиции вводимого символа и составлять корректную будущую строку для проверки шаблоном: Код: (vb) Private Sub t_OffsetX_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Название: Re:Вопрос по контролю ввода с помощью VBScript.RegExp Отправлено: Muskin2029 от 05.07.2020, 11:47:20 Дмитрий, спасибо за пример, однако есть моменты, когда он не срабатывает.
При первом попадании на поле t_OffsetX Tab-ом вводятся только отрицательные числа, положительные - стопор. После ухода с этого поля, а затем возврата на него c помощье Shift+Tab или выделения его мышкой ввод любых чисел не возможен. После небольшой паузы, написал такой вот код: Код: (vb) Private Sub t_OffsetX_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)Заменил шаблон для исключения при вводе ненужных нолей (-0, -012, 007 и т.п.). |