14/ Робота з клавіатурою
Познайомимося з подіями, пов'язаними з клавіатурою. Їх три: KeyDown (клавіша натиснута), KeyUp (клавіша відпущена) і KeyPress (ввели з клавіатури символ).
Подія KeyPress. Клас KeyPressEventArgs. Структура Char
Створіть проект з однієї форми, без єдиного елемента управління. Зайдіть у вікно коду і виберіть для форми подію KeyPress. В тілі процедури запишіть наступний код:
Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles MyBase.KeyPress
Debug.Write(e.KeyChar)
End Sub
Запустіть проект, натискайте клавіші клавіатури і спостерігайте за результатами у вікні Output. Кожного разу, як ви натискаєте на алфавітно-цифрову клавішу (тобто набираєте на клавіатурі букву, цифру, знак пунктуації або інший символ), набраний символ з'являється у вікні Output. Спробуйте ввести великі літери, російські літери. Усе виходить:
qwertyQWERTY12345,.!фывапроФЫВАПРО()"№;%:?*
Більш того, натиснення клавіш пробілу, введення і табуляції викликає звичний ефект. Враження таке, що вікно Output перетворилося у вікно текстового редактора.
Натискання функціональних (F1 - F12) і багатьох керуючих клавіш не викликає події KeyPress. (Керуючі клавіші - це ті, що зосереджені в основному в лівому кінці клавіатури і в правій її частині лівіше додаткової цифрової клавіатури.)
З програми видно, що символи, що виводяться у вікно Output, є значеннями властивості KeyChar об'єкта e, що належить класу KeyPressEventArgs. Між тим, значення властивості KeyChar є структура Char, що володіє рядом корисних методів, дію деяких з яких видно з наступної програми:
Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
Dim Символ As Char = e.KeyChar
Debug.WriteLine("Набрано символ" & Символ)
Debug.WriteLine("Це цифра?" & Char.IsDigit(Символ))
Debug.WriteLine("Це літера?" & Char.IsLetter(Символ))
Debug.WriteLine("Правда, що це буква чи цифра?" & Char.IsLetterOrDigit(Символ))
Debug.WriteLine("Це маленька літера?" & Char.IsLower(Символ))
Debug.WriteLine("Це заголовна літера?" & Char.IsUpper(Символ))
Debug.WriteLine("Це знак пунктуації?" & Char.IsPunctuation(Символ))
Debug.WriteLine("Це пробіл?" & Char.IsSeparator(Символ))
Debug.WriteLine("Перетворити в малу" & Char.ToLower(Символ))
Debug.WriteLine("Перетворити в заголовну" & Char.ToUpper(Символ))
End Sub
Ось як відреагує ця програма на введення великої російської літери «Ж»:
Набрано символ Ж
Це цифра? False
Це літера? True
Правда, що це буква чи цифра? True
Це маленька літера? False
Це заголовна літера? True
Це знак пунктуації? False
Це пробіл? False
Перетворити в малу ж
Перетворити в заголовну Ж
Аналізувати які вводяться з клавіатури символи для управління комп'ютером можна, наприклад, такими операторами:
If Символ = ":" Then Debug.WriteLine("Набрано двокрапку")
If Char.IsDigit(Символ) Then Debug.WriteLine("Набрано цифру")
Події KeyDown і KeyUp. Клас KeyEventArgs
При натисканні майже будь-якої клавіші клавіатури спрацьовує подія KeyDown. Якщо при цьому натискання приводить до введення символу, то відразу за ним спрацьовує подія KeyPress. Якщо ви утримуєте клавішу, ця парочка спрацьовує багато разів і часто. При відпусканні клавіші одноразово спрацьовує подія KeyUp. Ми не розглядаємо ситуацію, коли одночасно утримуються натиснутими дві і більше клавіш.
KeyCode. Які саме клавіші клавіатури були натиснуті або відпущені, вам підкаже властивість KeyCode об'єкта e, що належить класу KeyEventArgs. Введіть такий код:
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e KeyEventArgs) Handles MyBase.KeyDown
Debug.WriteLine(e.KeyCode.ToString)
End Sub
Запустіть проект, пройдіться по всіх клавішах клавіатури (крім тих, звичайно, що вимикають комп'ютер). Ось що ви побачите:
Друк у вікні Output |
Яка клавіша була натиснута |
D L F1 Tab Enter Left Space D1 D2 Escape ControlKey ShiftKey Menu |
D L F1 Tab Enter Стрілка вліво Пробіл Цифра 1 Цифра 2 Esc Ctrl Shift Alt |
Властивості Control, Alt, Shift. VB дозволяє визначити, які з трьох клавіш Ctrl, Alt, Shift утримувалися натиснутими у момент спрацьовування події KeyDown або KeyUp. Доповніть процедуру:
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
Debug.WriteLine(e.KeyCode.ToString & " " & e.Control & " " & e.Alt & " " & e.Shift)
End Sub
Тут використано властивості Control, Alt, Shift об'єкта e. Їхній зміст буде зрозуміоий з роздруківки у вікні Output. Запустіть проект, натисніть і утримуйте клавіші Alt і Shift (але не Ctrl), після чого клацніть по клавіші W. Ось що ви побачите останнім надрукованим рядком у вікні Output:
W False True True
Все сказане стосується і події KeyUp.
Аналізувати натиснення клавіш для управління комп'ютером можна, приміром, такими операторами:
If e.KeyCode = Keys.F2 Then Debug.WriteLine("Натиснута клавіша F2")
If e.Shift Then Debug.WriteLine("Натиснута клавіша Shift")
If e.Control And e.KeyCode = Keys.Right Then Debug.WriteLine("Натиснута стрілка направо при натиснутій клавіші Ctrl")
Перерахування Keys включає в себе коди клавіш клавіатури.
Події клавіатури у елементів управління. Події, пов'язані з клавіатурою, є в багатьох елементів управління. Помістимо на форму, наприклад, пару кнопок і текстове поле. До того ж до процедури Form1_KeyDown напишемо три процедури:
Private Sub Button1_KeyDown …
Private Sub Button2_KeyDown …
Private Sub TextBox1_KeyDown …
Запустимо програму і клацнемо по якій-небудь клавіші. Яка з чотирьох процедур спрацює? Та, чий елемент управління знаходиться у фокусі. А оскільки один який-небудь елемент на формі завжди знаходиться у фокусі, до процедури Form1_KeyDown справа ніяк не доходить. Це не завжди буває зручно. І проти цього в VB є спеціальний прийом: властивість форми KeyPreview встановлюється в True. Це означає наказ комп'ютера при натисканні на клавішу спочатку викликати подію форми, а вже потім іншого об'єкта. Так, якщо у фокусі знаходиться кнопка 2, то при натисканні на клавішу клавіатури спочатку виконується процедура Form1_KeyDown, а відразу за нею - Button2_KeyDown. Сказане стосується більшості клавіш і елементів управління, але не всіх.
Приклади використання деяких подій клавіатури
Приклад 1. Помістимо на формі елемент управління Label. Програму складемо таким чином, щоб при кожному натисненні клавіші d в надписі відображалася кількість цих натиснень.
Private Sub Form2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
Static а As Integer
If e.KeyChar = "d" Then а = а + 1
Label1.Text = а
'e.Handled = True
End Sub
Запустивши програму, можна переконатися, що кожне натискання клавіші d збільшує на одиницю число, відображене на елементі управління Label. Тепер додамо до інтерфейсу програми текстове поле TextBox. У результаті, крім відліку кількості натискань, програма буде друкувати в текстовому полі букву d. Але якщо ця дія нам не потрібна, слід додати в код рядок e.Handled = True. У прикладі цей рядок відзначений знаком «коментар». Не слід забувати, що властивість форми KeyPreview має дорівнювати True. Тепер, скільки б ви не натискали клавішу d, текстове поле буде залишатися порожнім.
