Для зручності роботи оператора многооконной програми іноді корисно зробити функціонал закриття поточної форми після натискання клавіші Escape. Стандартний вихід натисканням мишкою на кнопці виходу вікна (хрестик в правому верхньому куті) іноді дійсно може бути менш зручним, ніж одна клавіша на клавіатурі. Це може бути, наприклад, при заповненні послідовно декількох форм з переходами на другорядні форми для вибору якихось додаткових значень або налаштувань.
Реалізувати цю функцію не складно. Створимо нову програму з порожньою формою. Далі додамо для події OnKeyPress форми програмний код, який виконує закриття форми (метод Close). Причому, перед ним має бути умова, що перевіряє, що була натиснута саме клавіша Escape. Без такого умови програма буде закриватися при натисканні на будь-яку клавішу. Ось приклад готового коду:
procedure TMyForm.FormKeyPress (Sender: TObject; var Key: Char);
begin
if Key = # 27 then Close;
end;
Тут, Key - це змінна, яка містить код натиснутоюклавіші; # 27 код символу Esc; Close - команда закриття форми.
Якщо зараз запустити програму і натиснути Esc, програма, як і планувалося, закриється. Однак, ще не все. Якщо зараз додати на форму будь-який компонент, то фокус програми буде переданий йому. Це означає, що поки на формі немає нічого, то запускаючи програму, події клавіатури і миші спрацьовують саме для форми і наша програма коректно працює. Але, якщо активним буде який-небудь інший компонент (фокус), то після натискання кнопки на клавіатурі буде спрацьовувати подія OnKeyPress цього компонента, а не форми.
Встановивши зараз компонент Edit на форму і запустивши програму, можна переконатися, що натискання на Esc не дає ніякого результату. Адже для події OnKeyPress нашого Edit не було нічого вказано.
Можна звичайно, тепер для кожного компонента призначити обробку цієї події з командою виходу. Але таке рішення не дуже-то зручно, тому що таке воно занадто громіздко, а головне - адже інші компоненти можуть мати власні процедури на цю подію.
Отже, потрібно зробити так, щоб форма реагувала на подію OnKeyPress, не заважаючи цього ж події спрацьовувати в інших компонентах. Для цього потрібно налаштувати властивість форми KeyPreview. Це логічне властивість якраз відповідає за порядок обробки подій клавіатури. За замовчуванням воно дорівнює False (Брехня). Це означає, що подія обробляється поточним активним компонентом. Привласнюючи цій властивості значення True (Істина), ми вказуємо, що на початку події клавіатури будуть виконуватися обработчиками подій форми, а потім активним компонентом.
Оскільки в інспекторові об'єктів цієї властивості форми немає, можна налаштувати його програмно, на подію створення форми OnCreate. Додамо в програму такий код:
procedure TMyForm.FormCreate (Sender: TObject);
begin
MyForm.KeyPreview: = True;
end;
Тепер, при запуску програми (якщо бути точним, то при створенні форми), властивості форми KeyPreview буде присвоєно значення True.
Після такої доопрацювання, програма буде коректно закриватися після натискання на Escape при будь-яких наявних компонентах у вікні. Причому, навіть тоді, коли якісь із них будуть утримувати свої процедури на подію OnKeyPress, вони так само будуть правильно виконуватися.