Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7777777777.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
80.44 Кб
Скачать

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, текстове поле буде залишатися порожнім.