Починаючи з самого світанку комп'ютерної промисловості, клавіатура була первинним пристроєм введення інформації, і найімовірніше збереже свою позицію ще довгий час.
Події клавіатури, поряд з подіями миші, є основними елементами взаємодії користувача з програмою. В даній статті піде мова про трьох подіях, які дозволяють відловлювати натискання клавіш в додатку Delphi: OnKeyDown, OnKeyUp і OnKeyPress.
Для отримання введення з клавіатури, додатки Delphi можуть використовувати два методи. Найпростіший спосіб, це скористатися одним з компонентів, автоматично реагує на натискання клавіш, таким як Edit. Другий спосіб полягає в створенні процедур у формі, які будуть обробляти натискання і відпускання клавіш. Ці обробники можуть обробляти як натискання одиночних клавіш, так і комбінацій. Отже, ось ці події:
OnKeyDown - викликається, коли на клавіатурі натискається будь-яка клавіша. OnKeyUp - викликається, коли будь-яка клавіша на клавіатурі відпускається. OnKeyPress - викликається, коли натискається клавіша, що відповідає за певний ASCII символ.
Тепер саме час подивитися, як виглядають в програмі заголовки оброблювачів:
Всі події мають один загальний параметр, зазвичай званий Key. Цей параметр використовується для передачі коду натиснутої клавіші. Параметр Shift (в процедурах OnKeyDown і OnKeyUp), вказує на те, чи була натиснута клавіша в поєднанні з Shift, Alt, і Ctrl.
Фокус
Фокус, це здатність отримувати призначений для користувача введення через миша або клавіатуру. Отримувати події від клавіатури можуть тільки ті об'єкти, які мають фокус. На формі активного застосування в один момент часу може бути активним (мати фокус) тільки один компонент.
Деякі компоненти, такі як TImage, TPaintBox, TPanel і TLabel не можуть отримувати фокус, іншими словами, це компоненти, успадковані від TGraphicControl. Так само не можуть отримувати фокус невидимі компоненти, такі як TTimer.
OnKeyDown, OnKeyUp
Події OnKeyDown і OnKeyUp забезпечують найнижчий рівень відповіді клавіатури. Обробники OnKeyDown і OnKeyUp можуть реагувати на всі клавіші клавіатури, включаючи функціональні і комбінації з клавішами Shift, Alt, і Ctrl.
Події клавіатури - взаємовиключні. Коли користувач натискає кнопку, то генеруються дві події OnKeyDown і OnKeyPress, а коли відпускає, то тільки одне: OnKeyUp. Якщо користувач натисне одну з клавіш, яку OnKeyPress не зможе визначити, то буде згенеровано тільки одна подія OnKeyDown, а при відпуску OnKeyUp.
OnKeyPress
OnKeyPress повертає різні значення ASCII для 'g' і 'G,'. Однак, OnKeyDown і OnKeyUp не роблять різниці між великими та малими.
Параметри Key і Shift
Параметр Key можна змінювати, щоб додаток отримало інший код натиснутоюклавіші. Таким чином можна обмежувати набір різних символів, які користувач може ввести з клавіатури. Наприклад дозволити вводити тільки цифри. Для цього додайте в обробник події OnKeyPress наступний код і встановіть KeyPreview в True (див. Нижче).
f Key in [ 'a' .. 'z'] + [ 'A' .. 'Z'] then Key: = # 0
Цей вислів перевіряє, чи містить параметр Key символи нижнього регістра ( 'a' .. 'z') і символи верхнього регістру ( 'A' .. 'Z'). Якщо так, то в параметр заноситься значення нуля, щоб запобігти введення в компонент Edit (наприклад).
У Windows визначено спеціальні константи для кожної клавіші. Наприклад, VK_RIGHT відповідає коду клавіші для правої стрілки.
Щоб отримати стану спеціальних клавіш, таких як TAB або PageUp можна скористатися API функцією GetKeyState. Клавіші стану можуть перебувати в трьох станах: відпущена, натиснута, і включена. Якщо старший біт дорівнює 1, то клавіша натиснута, інакше відпущена. Для перевірки цього біта можна скористатися API функцією HiWord. Якщо молодший біт дорівнює 1, то клавіша включена. Ось приклад отримання сосотоянія спеціальної клавіші:
У подіях OnKeyDown і OnKeyUp, Key є беззнаковим двобайтовим (Word) значенням, яке представляє віртуальну клавішу Windows. Для получанія значення символу можна скористатися функцією Chr. У події OnKeyPress параметр Key є значенням Char, яке представляє символ ASCII.
Події OnKeyDown і OnKeyUp мають параметр Shift з типом TShiftState. У Delphi тип TShiftState визначений як набір прапорів, що визначають стан Alt, Ctrl, і Shift при натисканні клавіші.
Наприклад, наступний код (з обробника OnKeyUp) з'єднує рядок 'Ctrl +', утримуючи і відображає результат в заголовку форми:
Якщо натиснути Ctrl + A, то будуть згенеровані наступні події:
Щоб перехопити натискання клавіш на рівні форми, до того як вони будуть передані компонентів на формі, необхідно встановити властивість KeyPreview в True. Після цього компонент як і раніше буде отримувати події, однак спершу вони будуть потрапляти в форму, щоб дати можливість програмі дозволити або заборонити введення різних символів.
Припустимо, У Вас на формі є кілька компонентів Edit і процедура Form.OnKeyPress виглядає наступним чином:
Якщо один з компонентів Edit має фокус і властивість KeyPreview встановлено в False, то цей код не буде виконаний - іншими словами, якщо користувач натисне кнопку '5', то в компоненті Edit, що має фокус, з'явиться символ "5".
Однак, якщо KeyPreview встановлено в True, то подія форми OnKeyPress буде виконано до того, як компонент Edit побачить натиснуту клавішу. Тому, якщо користувач натисне кнопку '5', то в Key буде підставлена нульове значення, запобігаючи тим самим потрапляння числових символів в Edit.
Таблиця кодів віртуальних клавіш.
Symbolic
constant name