Space Base Space Base
+7 928 008-80-89
ru
  • en
  • es
  • Главная
  • Услуги
  • Портфолио
  • Библиотека
  • Контакты
  • Главная
  • Услуги
  • Портфолио
  • Библиотека
  • Контакты
  1. Библиотека
  2. Delphi
  3. Закрытие формы нажатием Escape в Delphi
logo

Закрытие формы нажатием Escape в Delphi

11.01.2017

Для удобства работы оператора многооконной программы иногда полезно сделать функционал закрытия текущей формы по нажатию клавиши 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, они так же будут правильно выполняться.

Другие материалы:

Функция DeleteFile в Delphi, описание и примеры


Математические функции в Delphi


Назначение размера столбцов и строк Delphi StringGrid


Написать комментарий

Комментарии

В комментариях запрещено публиковать рекламные материалы. Все сообщения оправляются на модерацию и будут опубликованы, если не нарушают правил сайта после проверки.


коммент.

avatar

Антон Сенников

- 23 августа 2021, 12:53 ↓
Добрый день, Alex.
Статья была написана очень давно. В Delphi 7 точно работает. Вероятно и далее наследоваться должно, но не проверял на более поздних версиях.
avatar

alex

- 19 августа 2021, 23:52 ↓
KeyPreview есть в инспекторе объектов у формы. Про какую версию Delphi идет речь?
avatar

подпивасник

- 04 июня 2021, 00:50 ↓
Помогло, спасибо!

Разработка сайтов

Корпоративный сайт
Интернет-магазин
Лендинг - одностраничный сайт
Сайт-визитка
Сайт-портфолио

Проектирование

Прототип, UX-дизайн

Дизайн

UI-дизайн
Логотип

+54 911 2801-4950

info@space-base.net
+7 928 008-80-89

Web-сайты для успешного бизнеса

Web-сайты для успешного бизнеса

Главная Услуги Портфолио События Библиотека Контакты
+7 928 008-80-89 Меню
Политика в отношении обработки персональных данных © Copyright 2014 - | Space-Base

Лучшее время начать свой проект - Сейчас!

Выбраны опции:

Отправить сообщение на:

Telegram WhatsApp

Отправляя сообщение, вы даете свое согласие на
обработку песональных данных