Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать событие на клавишу ESC? 
:(
    Опции темы
Rusman
Дата 19.7.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.5.2006
Где: Пермь

Репутация: нет
Всего: нет



Подскажите пожалуйста как создать событие на ESC?
Спасибо!
PM MAIL ICQ Skype   Вверх
VICTAR
Дата 19.7.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



Код

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

PM MAIL   Вверх
Rusman
Дата 19.7.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.5.2006
Где: Пермь

Репутация: нет
Всего: нет



Цитата(VICTAR @ 19.7.2008,  11:29)
Код

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

Странно, но не рботает 
PM MAIL ICQ Skype   Вверх
VICTAR
Дата 19.7.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



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

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

PM MAIL   Вверх
Rusman
Дата 20.7.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.5.2006
Где: Пермь

Репутация: нет
Всего: нет



Ага, сделал так, но проблема решена не полностью. Вот я вызываю из главное формы форму, потом нажимаю ESC у меня закрывается, потом снова вызываю эту же форму но уже при нажатии ESC она не закрывается, только после перезапуска программы.
PM MAIL ICQ Skype   Вверх
VICTAR
Дата 20.7.2008, 15:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



Посмотри  аттач. Закрывается и с первого, и второго, и со сто двадцать пятого  smile  

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  escape.rar 1,74 Kb
PM MAIL   Вверх
Virtuals
Дата 22.7.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 1
Всего: 11



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

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

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

соответственно просто убери захват фокуса элементами с формы
PM MAIL ICQ   Вверх
pseud
Дата 22.7.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



кидаешь на форму кнопку TButton и выстваляешь ей свойство
Код

Cancel := True;

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

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



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Olegan
Дата 22.7.2008, 14:17 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крутой сисадмин
**


Профиль
Группа: Завсегдатай
Сообщений: 752
Регистрация: 15.5.2007

Репутация: нет
Всего: 105



Код

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.

а так?


--------------------
Цитата(Mayk @  18.6.2008,  14:29 Найти цитируемый пост)
/me объявляет Olegan врагом народа

Цитата(gta4kv @  20.6.2008,  22:01 Найти цитируемый пост)
/me объявляет Olegan врагом народа во второй раз

Цитата(localhost @  15.6.2009,  08:45 Найти цитируемый пост)
/me объявляет Olegan врагом народа в третий раз
PM MAIL   Вверх
Alexzz
Дата 23.7.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 9.4.2007
Где: Латвия

Репутация: 1
Всего: 1



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

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

  KeyPreview := True;

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

Собственно я как раз ищу такой способ, так как тоже столкнулся с перехватом фокуса другими объектами и сложностями с обработкой глобальных клавиш, которые должны выполняться независимо от того, где на форме находится фокус.
PM WWW ICQ MSN   Вверх
VICTAR
Дата 23.7.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



Цитата(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 это свойство можно выставить в инспекторе объектов. В примере так сделано "чтобы заметили" =)
PM MAIL   Вверх
pseud
Дата 23.7.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



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

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

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



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
hunterpro
Дата 6.8.2008, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.8.2008
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



вот же лосось даже у меня работает!!!! ))))) smile 
PM MAIL ICQ   Вверх
Poseidon
Дата 7.8.2008, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



pseud, ставил не я, но я тебе обьясню за что.

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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
pseud
Дата 7.8.2008, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



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

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

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




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0974 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.