Распознавание нажатий клавиш
Используйте события KeyPress, KeyDown и KeyUp, чтобы отвечать на нажатия клавиш пользователем. Событие KeyPress удобно использовать для распознавания клавиш с обычными "печатаемыми" символами (буквы, числа, знаки пунктуации), когда нужно обработать информацию, вводимую в текстовое поле или в поле со списком. С помощью этого события распознаются также многие из комбинаций типа <Ctrl+клавиша>, а также клавиша <Backspace>. Немного позже я покажу, как проверить или изменить напечатанный символ с помощью процедуры обработки события KeyPress.
События KeyDown и KeyUp, напротив, распознают практически любую посылаемую им комбинацию клавиш, включая выкрутасы типа <Alt+Shift+Ctrl+F9>. С этими событиями работать труднее, чем с KeyPress, но зато они позволяют использовать более широкий набор сочетаний клавиш. Например, можно создать процедуру обработки события KeyDown, которая позволяет с помощью комбинаций <Ctrl+<-> и <Ctrl+->> соответственно уменьшать или увеличивать значение полосы прокрутки, например, на 10.
В главе 10 мы обсудили основные приемы, позволяющие убедиться в том, что пользователь ввел в форму правильные сведения. Здесь мы обсудим еще несколько приемов.
В случае текстовых полей и полей со списком некоторые символы для вводимых данных не допускаются. Используйте процедуру обработки события KeyPress, чтобы убрать с экрана недопустимые символы в случае печатания их пользователем. Следующий программный код позволяет вводить только буквы и цифры:
Private Sub txtSerial Number_KeyPress(ByVal KeyAscii _
As MSForms.ReturnInteger)
' весь следующий блок является условием:
If Chr(KeyAscii) < "0" Or _
(Chr(KeyAscii) > "9" And Chr(KeyAscii) < "A") Or _
(Chr(KeyAscii) > "Z" And Chr(KeyAscii) < "a") Or _
Chr(KeyAscii) > "z" Then
MsgBox "Недопустимый символ!"
KeyAscii = 0 ' отбрасывание символа
End If
End Sub
Да, я признаю, что используемое здесь условие оказалось довольно длинным, но зато оно работает. Как только оператор If ... Then обнаружит недопустимый символ, отображается сообщение об этом. Затем идет оператор KeyAscii = 0; KeyAscii является аргументом процедуры обработки события KeyPress, поэтому он используется как локальная переменная в данной процедуре. Изменение его значения меняет код символа, передаваемого в текстовое поле. А поскольку само текстовое поле не воспринимает символ, имеющий код 0, напечатанный пользователем недопустимый символ исчезнет без следа.
Изменение значения аргумента KeyAscii позволяет изменять неправильно введенные данные на правильные. Например, следующую процедуру обработки события можно использовать для отображения и сохранения вводимого пользователем текста в виде текста, записанного буквами верхнего регистра:
Private Sub txtSerial Number_KeyPress(ByVal KeyAscii _
As MSForms.ReturnInteger)
KeyAscii = Asc(UCase(Chr(KeyAscii)))
End Sub
Оператор, осуществляющий преобразование, потребовал использования трех функций, вложенных одна в другую. Поскольку KeyAscii является числовым кодом символа, сначала приходится конвертировать этот код в строку с помощью функции Chr, затем перевести строку в верхний регистр с помощью UCase и, наконец, конвертировать строку снова в целое число с помощью Asc.
Если вы хотите перепроверять значение элемента управления при каждом изменении, создайте процедуру обработки события или используйте готовую из предыдущего подраздела. Но иногда предпочтительнее отложить проверку данных до момента, когда пользователь завершит ввод полностью. Некоторые будут признательны вам за возможность без посторонней помощи корректировать вводимые ими данные перед тем, как окончательно передать эти данные на проверку программе, - это они воспринимают как косвенное признание их умственных способностей.
Отложить проверку имеет смысл и в том случае, если она занимает много времени. Если придется сравнивать введенные данные с данными из какой-нибудь базы данных или данными из Internet, вы, наверное, не захотите заставлять пользователя ждать, пока программа будет искать данные для сравнения после каждого нажатия клавиши и каждого щелчка кнопки мыши.
Чтобы проверить значение элемента управления после того, как пользователь закончит ввод полностью, создайте процедуру обработки события BeforeUpDate. Эти события происходят, когда пользователь щелкает на другом элементе управления, нажимает клавишу <Tab> или нажимает комбинацию клавиш, назначенную другому элементу управления. VBA регистрирует событие BeforeUpDate непосредственно перед тем, как покинуть данный элемент управления, тут вы и можете отменить обновление данных и остаться на месте, предлагая пользователю исправить ошибку. Следующий пример показывает, как использовать оператор Cancel:
Private Sub txtSerial Number_Change()
If Len(t xt Serial Number.Value) > 5 Then
MsgBox "Слишком много символов. Повторите ввод."
Cancel
End If
End Sub
Иногда имеет смысл отложить проверку данных элемента управления до того момента, когда пользователь щелкнет на кнопке ОК, закрывающей форму. Это приходится делать тогда, когда критерии проверки используют значения нескольких элементов управления в форме. Если вы выбрали такой тип проверки, поместите соответствующий программный код в процедуру обработки события Click кнопки ОК. Предположим, вы разрабатываете форму, которая позволит пользователю ввести даты будущих важных событий. В форме есть список, в котором пользователь может указать, за какое время до наступления события нужно напомнить о нем. Если пользователь запланирует некоторую встречу на завтра, но попросит напомнить о ней за два дня до этого, вы можете сообщить о запрете ввода таких данных уже после того, как пользователь щелкнет на кнопке ОК. Таким образом вам не придется просить пользователя ввести данные в элементы управления в определенном порядке, чтобы избежать появления сообщений об ошибке.
Часть V Великолепные десятки
В этой части...
Эта короткая часть, оставленная на десерт, подогревает интерес к УВЛ множеством эффектных примеров. Попробовав представленное здесь, вы непременно захотите еще.
В главе 20 обсуждается ряд тонких приемов программирования, вполне способных заставить "летать " вашу VBA-программу.
Среди рассмотренных тем - запись информации в реестр
Windows и извлечение информации из него, использование возможностей других приложений и компонентов, чтение и запись дисковых файлов, а также добавление элементов управления ActiveX в