пятница, 25 октября 2013 г.

Закрытие формы по нажатию на Escape


    Во многих приложениях, часть функций управления посредством мыши, для удобства дублируется в клавиатуре. Скажем клавишу Insert, - ставят в соответствие с функцией добавления строк в таблице, клавиша Delete, - обычно ассоциируется с удалением чего бы то ни было, а клавиши навигации соответственно для перемещения области выделения объектов на форме, или курсора - по полям для ввода текста. Мы же рассмотрим на мой взгляд наиболее востребованную фишку - "закрытие формы по нажатию клавиши Esc";
Существует ряд вариантов реализации такого действа. Чаще всего встречается вот такой метод:

 1) Свойство KeyPreview формы выставляется в true, создается обработчик событий OnKeyPress на форме и прописывается следующий код:

begin if Key = #27 then 
Close;
end; 

  Данный код, вполне рабочий, но не совсем корректен и убедиться в этом можно достаточно просто. Помещаем ко всему прочему на форму, скажем MaskEdit, запускаем наше приложение, нажимаем клавишу Esc и вуаля, форма наша не закрывается должным образом.
  Интересное решение проблемы, я нашел на сайте delphinotes.ru. Автор рассматривает решение проблемы путем обработки диалоговых клавиш сообщением CMDialogKey - он специально предназначен для подобных мероприятий.
 
В общем, ближе к делу:

  1) Создаем новый проект;

  2) В редакторе кода записываем следующую процедуру:

procedure TForm1.CMDialogKey(var Message: TCMDialogKey);

begin 
with Message do if (CharCode=VK_ESCAPE) and (KeyDataToShiftState(KeyData)=[]) then
begin
if fsModal in FormState then 
begin ModalResult := mrCancel;
end 
else 
Result := Integer(PostMessage(Handle, WM_CLOSE, 0, 0)); 
if Result <> 0 then 
Exit; 
end; 
inherited; 
end; 

 3) В разделе private прописываем две строчки: procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;

 4) Помещаем на форму любые компоненты, связываем их как угодно, запускаем проект, нажимаем наш многострадальный Esc и ... вуаля!!! Наш код работает на все 100%. 

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.