Закрываем форму кнопкой Esc в Delphi
Существует ряд вариантов реализации такого поведения. Чаще всего встречается вот такой метод:
1) Свойство KeyPreview формы выставляется в true, создается обработчик событий OnKeyPress на форме и прописывается следующий код:
1 2 3 4 |
begin if Key = #27 then Close; end; |
Данный код, вполне рабочий, но не совсем корректен и убедиться в этом можно достаточно просто. Помещаем ко всему прочему на форму, скажем MaskEdit, запускаем наше приложение, нажимаем клавишу Esc и наша форма не закроется должным образом.
Интересное решение проблемы путем обработки диалоговых клавиш сообщением CMDialogKey. CMDialogKey — специально предназначен для подобных мероприятий:
1) Создаем новый проект;
2) В редакторе кода записываем следующую процедуру:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
procedure TForm1.CMDialogKey(var Message: TCMDialogKey); begin with Message do if (CharCode=VK_ESCAPE) and (KeyDataToShiftState(KeyData)=[]) then // Если нажата Esc и сдвиговые клавиши (Shift, Ctrl, Alt) не зажаты тогда begin if fsModal in FormState then // Если присутствует модальное окно begin ModalResult := mrCancel; //Закрытие модального окна Result := 1; end else Result := Integer(PostMessage(Handle, WM_CLOSE, 0, 0)); // Если нет, закрываем основное if Result <> 0 then Exit; end; inherited; end; |
3) В разделе private прописываем две строчки:
1 2 |
procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; |
4) Помещаем на форму любые компоненты, связываем их как угодно, запускаем проект, нажимаем на Esc.