СтатьиПрограммирование в Delphi

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

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


Комментарии

Имя:
Текст комментария:
* В комментариях запрещено публиковать рекламные объявления. Сообщения, содержащие ссылки на сторонние ресурсы добавляется в скрытом режиме. Они будут открыты, если не нарушают установленных правил, после проверки.
Защита от спам-роботов (* Обязателельно укажите ответ на простой вопрос ниже.)
Под каким номером в алфавите буква «Б»? (цифра)