Закрыть форму по клавише Esc. Как?

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
KOL48
новенький
Сообщения: 14
Зарегистрирован: 16.04.2010 10:10:48

Закрыть форму по клавише Esc. Как?

Сообщение KOL48 »

Lazarus 0.9. ОС Windows XP SP3.

Как закрыть форму по нажатию клавиши Esc?

Спасибо.
Аватара пользователя
vertu
новенький
Сообщения: 12
Зарегистрирован: 09.02.2010 10:02:19

Сообщение vertu »

устанавливаешь свойство формы KeyPreview := True и создаешь обработчик события onKeyPress из одной строки:

Код: Выделить всё

procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
begin
  if Key = #27 then close;
end;
KOL48
новенький
Сообщения: 14
Зарегистрирован: 16.04.2010 10:10:48

Сообщение KOL48 »

Да, этот совет я уже видел где-то. Только почему-то не срабатывает. Делал так:

Код: Выделить всё

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

procedure TForm1.FormKeyPress
(Sender: TObject; var Key: Char) ;
begin
   if key = #27 then Close;
end;           


На строку
(Sender: TObject; var Key: Char) ;
компилятор ругается так: "unit1.pas(91,1) Error: method identifier expected"

На строку
if key = #27 then Close;
компилятор ругается так: "unit1.pas(93,22) Error: Wrong number of parameters specified for call to "Close""

Почему -- мне не понятно. Ткните носом.
Аватара пользователя
amateur
энтузиаст
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Сообщение amateur »

Код: Выделить всё

procedure TForm2.FormKeyPress(Sender: TObject; var Key: char);
begin
  if Key = #27 then close;
end;


Вторая форма диалоговое окно (автосоздаваемое). В первой форме кнопка и обработчик:

Код: Выделить всё

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


В винде работает... (KeyPreview := True; установил в форме 2 в дизайнере). Лазарь 0.9.29 ФПС 2.5.1

Кстати "unit1.pas( а Вы случаем не главную формы пытаетесь закрыть подобным образом ??? Да нет и в главной форме нет проблем. Чет ниче не ругается :cry:
KOL48
новенький
Сообщения: 14
Зарегистрирован: 16.04.2010 10:10:48

Сообщение KOL48 »

FPC v2.2.4 -- может из-за этого?
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

KOL48 писал(а):Почему -- мне не понятно. Ткните носом.

а в интерфейсе класса TForm1 эти методы описаны?!
а связка в Event-ах есть ли?

Код: Выделить всё

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender:TObject);
    procedure FormKeyPress(Sender:TObject;var Key:char);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

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

procedure TForm1.FormKeyPress(Sender:TObject;var Key:char);
begin
  if Key=#27 then Close;
end;                 
Вложения
Picture 4.png
KOL48
новенький
Сообщения: 14
Зарегистрирован: 16.04.2010 10:10:48

Сообщение KOL48 »

Всё получилось.

Спасибо вам, добрые люди.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

amateur писал(а):Вторая форма диалоговое окно (автосоздаваемое). В первой форме кнопка и обработчик:

Код: Выделить всё

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

Если на Form2 есть кнопка "Отмена", то выставить ее свойства Cancel=True, ModalResult=mrCancel,

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
begin
 if Form2.ShowModal=mrCancel then Exit;
 ...
end;

И не надо никакой KeyPreview и onKeyPress.
KOL48
новенький
Сообщения: 14
Зарегистрирован: 16.04.2010 10:10:48

Сообщение KOL48 »

v-t-l писал(а):И не надо никакой KeyPreview и onKeyPress.


А для главной формы можно так сделать? У меня главная форма закрывается по Esc только, если кнопка Cancel со свойством Cancel=True находится под курсором.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Нет, только если главная форма отображается по ShowModal :) .

Если на форме есть ActionList, то можно добавить Action, выставить его ShortCut='Esc', а в обработчике OnExecute написать Close.
Или есть меню, то к пункту "Выход".
KOL48
новенький
Сообщения: 14
Зарегистрирован: 16.04.2010 10:10:48

Сообщение KOL48 »

vertu писал(а):устанавливаешь свойство формы KeyPreview := True и создаешь обработчик события onKeyPress из одной строки:

Код: Выделить всё

procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
begin
  if Key = #27 then close;
end;


Если курсор установлен на объекте TMaskEdit, то клавиша Esc не срабатывает. Как побороть?
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

v-t-l писал(а):Если на форме есть ActionList, то можно добавить Action, выставить его ShortCut='Esc', а в обработчике OnExecute написать Close.
Или есть меню, то к пункту "Выход".
KOL48
новенький
Сообщения: 14
Зарегистрирован: 16.04.2010 10:10:48

Сообщение KOL48 »

v-t-l писал(а):...добавить Action, выставить его ShortCut='Esc', а в обработчике OnExecute написать Close.


Клавиша Esc не обрабатывается. Также, как не обрабатываются некоторые другие клавиши и комбинации, предложенные по умолчанию.

Пробовал в ShortCut вручную писать Esc, Escape. Пробовал захватывать клавишу стандартными средствами. Не обрабатывается, хоть застрелись.
Ответить