Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как создать событие на клавишу ESC?


Автор: Rusman 19.7.2008, 11:14
Подскажите пожалуйста как создать событие на ESC?
Спасибо!

Автор: VICTAR 19.7.2008, 11:29
Код

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_ESCAPE then
    Close;
end;

Автор: Rusman 19.7.2008, 11:36
Цитата(VICTAR @ 19.7.2008,  11:29)
Код

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_ESCAPE then
    Close;
end;

Странно, но не рботает 

Автор: VICTAR 19.7.2008, 11:49
На форме наверное есть элементы, которые отбирают фокус
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  KeyPreview := True;
end;

Автор: Rusman 20.7.2008, 11:24
Ага, сделал так, но проблема решена не полностью. Вот я вызываю из главное формы форму, потом нажимаю ESC у меня закрывается, потом снова вызываю эту же форму но уже при нажатии ESC она не закрывается, только после перезапуска программы.

Автор: VICTAR 20.7.2008, 15:22
Посмотри  аттач. Закрывается и с первого, и второго, и со сто двадцать пятого  smile  

Автор: Virtuals 22.7.2008, 12:08
Цитата(Rusman @  20.7.2008,  11:24 Найти цитируемый пост)
Ага, сделал так, но проблема решена не полностью. Вот я вызываю из главное формы форму, потом нажимаю ESC у меня закрывается, потом снова вызываю эту же форму но уже при нажатии ESC она не закрывается, только после перезапуска программы.

тебе-ж сказали
Цитата

На форме наверное есть элементы, которые отбирают фокус

соответственно просто убери захват фокуса элементами с формы

Автор: pseud 22.7.2008, 12:26
кидаешь на форму кнопку TButton и выстваляешь ей свойство
Код

Cancel := True;

а в событии OnClick:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

Автор: Olegan 22.7.2008, 14:17
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
   if key=char(27) then
      ShowMessage('ESC');
end;

end.

а так?

Автор: Alexzz 23.7.2008, 14:04
Цитата(VICTAR @ 20.7.2008,  15:22)
Посмотри  аттач. Закрывается и с первого, и второго, и со сто двадцать пятого  smile

Меня заинтересовала одна строчка в твоём коде:
Код

  KeyPreview := True;

Правильно ли я понял, что это свойство установленное в True позволяет событиям основной формы проверять коды нажатых клавиш прежде чем любой другой объект на форме? 

Собственно я как раз ищу такой способ, так как тоже столкнулся с перехватом фокуса другими объектами и сложностями с обработкой глобальных клавиш, которые должны выполняться независимо от того, где на форме находится фокус.

Автор: VICTAR 23.7.2008, 14:10
Цитата(Alexzz @  23.7.2008,  14:04 Найти цитируемый пост)
Правильно ли я понял, что это свойство установленное в True позволяет событиям основной формы проверять коды нажатых клавиш прежде чем любой другой объект на форме? 

да
Цитата

If KeyPreview is true, keyboard events occur on the form before they occur on the active control.

PS это свойство можно выставить в инспекторе объектов. В примере так сделано "чтобы заметили" =)

Автор: pseud 23.7.2008, 15:43
интересно кто мне такой боольшой минус 3 поставил?
и за что?
отзовись...
мануал гласит:
Цитата

TButton.Cancel
Determines whether the button’s OnClick event handler executes when the Escape key is pressed.

естественно это не подходит для окна_без_кнопок

Автор: hunterpro 6.8.2008, 20:28
вот же лосось даже у меня работает!!!! ))))) smile 

Автор: Poseidon 7.8.2008, 00:44
pseud, ставил не я, но я тебе обьясню за что.

Да, можно кинуть кнопку. Да, можно сделать ее невидимой и тогда можно добиться эфекта окна_без_кнопок. Но программисту будет видна эта кнопка в design-time. А смысл ее будет только в том, что бы закрыть форму. Грубо говоря - это извращения. Раньше я встречал ответы типо "Кинь Memo, сделай Memo.Visible:= False и делай в нем все, что хочешь." Твой ответ с той же оперы. Кинув первый взгляд на такие ответы создается впечатление непрофессиональности автора. Увидев подобный проект... Ведь если тебе нужна таблица с фиксированным количеством столбцов и строк, ты ведь не будешь ее делать при помощи несколькиз едитов, а воспользуешься гридом. Так и тут, зачем для закрытия формы использовать кнопку, если можно сделать все средствами самой формы? По меньшей мере это не логично.

Автор: pseud 7.8.2008, 09:00
Poseidon, я не предлагал сделать кнопку невидимой. сам такое не признаю.
но если у меня модальная форма (простая_сущность, настройки, о_программе, логин, и пр.), то там почти всегда есть кнопки ОК-Отмена.
которым я немедля в дизайне выставляю:
Код

btnOK.ModalResult := mrOK;
btnCancel.CancelButton := True;
btnCancel.ModalResult := mrCancel;

и в итоге больше ничего прописывать не надо. окно само закрывается по Esc с возвратом mrCancel.
если форма немодальная и на ней есть кнопка Отмена, то ей в обработчик пишу Close.
не я выдумал этот механизм, а Borland.
переубеди меня если я не прав, или опять:
Цитата(Poseidon @  7.8.2008,  00:44 Найти цитируемый пост)
создается впечатление непрофессиональности автора


Автор: Poseidon 7.8.2008, 12:14
pseud, перечитай первый пост. Во-первых, там ни слово про модальность. Во-вторых, там просят не закрыть форму по ESC, а создать событие. Вдруг нужно язык интерфейса сменить? А выставивь Cancel в True, ты будешь отлавливать ESC кнопкой, чего делать не просят.

Автор: THandle 7.8.2008, 12:33
pseud, минус сообщению поставил я, по перечисленным Посейдоном причинам.

Автор: pseud 7.8.2008, 12:36
PoseidonTHandle,
в продолжение пост автора вопроса:
Цитата(Rusman @  20.7.2008,  11:24 Найти цитируемый пост)
Ага, сделал так, но проблема решена не полностью. Вот я вызываю из главное формы форму, потом нажимаю ESC у меня закрывается, потом снова вызываю эту же форму но уже при нажатии ESC она не закрывается, только после перезапуска программы.

т.е. я понял верно.
закрытие окна по Esc


Автор: pseud 7.8.2008, 13:33
вобщем, как обычно - спор низачем.
без автора не разрулить.

Автор: mr.Anderson 10.8.2008, 17:47
Насторожила вот эта вещь:
Цитата

Вот я вызываю из главное формы форму, потом нажимаю ESC у меня закрывается, потом снова вызываю эту же форму но уже при нажатии ESC она не закрывается

Создается впечатление, что цель всех этих шаманств - это закрыть диалоговое окно по нажатию Esc. Тогда вы зря наезжаете на pseud, он все говорит верно, в любой диалоговой форме должны быть кнопки "ОК" и "Отмена", причем на отмену обычно устанавливают Cancel = True (ну и обычно еще modalResult = mrCancel) и все на том.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)