Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2013, 01:20   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию все события клавиш - напрямую окну с фокусом

вот, собственно, как это сделать?
надо чтобы при нажатии на стрелки в активное окно приходило сообщение,
а не переключался фокус на другое окно.

видел статью про "перехват" системных клавиш:
Цитата:
Создайте HandleMessages как метод формы и затем назначьте его Application.HandleMessages.
это только так можно решить или есть другие способы?

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

и тогда возникает вопрос, правильно ли я понимаю систему передачи сообщений:
допустим имеем такую иерархию окон:

Form1
---Panel1
------Button1 // фокус
------Button2
---Panel2
------Button3
------Button4

и в случае, например, нажатия клавиши, как пойдет сообщение,
напрямую в окно (windows -> Button1),
или пройдет по всем родительским, каждое из которых подумает, надо ли отправлять его дальше
(windows -> Form1 -> Panel1 -> Button1 ) ?


заранее спасибо.
xrob вне форума Ответить с цитированием
Старый 03.04.2013, 08:36   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
я где-то видел про какое-то свойство формы, от которого зависит, будет ли она обрабатывать сообщения сама или перешлет их кому надо, только не могу вспомнить как называется. может знает кто?
Tcustomform
Цитата:
Description

If KeyPreview is true, keyboard events occur on the form before they occur on the active control. (The active control is specified by the ActiveControl property.)

If KeyPreview is false, keyboard events occur only on the active control.

Navigation keys (Tab, BackTab, the arrow keys, and so on) are unaffected by KeyPreview because they do not generate keyboard events. Similarly, when a button has focus or when its Default property is true, the Enter key is unaffected by KeyPreview because it does not generate a keyboard events.

KeyPreview is false by default.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.05.2013, 05:02   #3
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

с большим трудом нашел решение проблемы!
надо обрабатывать не WM_KeyDown, а CN_KEYDOWN;
это сообщение успевает дойти до компонента раньше, чем его перехватит parent.

Код:
procedure MsgKeyDown(var Message:TWMKey);  message CN_KEYDOWN;

procedure TMyControl.MsgKeyDown(var Message:TWMKey);
begin
 case Message.CharCode of
  37 :trace('VK_LEFT');
  38 :trace('VK_UP');
  39 :trace('VK_RIGHT');
  40 :trace('VK_DOWN');
 end;
end;
xrob вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
события нажатие клавиш Karych Общие вопросы Delphi 1 04.01.2012 00:28
События на нажатие клавиш на C++ Builder tolmik Помощь студентам 14 01.10.2011 21:15
Обработчик события для смещения указателя мыши по окну программы... vedro-compota Мультимедиа в Delphi 8 15.06.2010 06:08
Управление фокусом JOHNKZ1 Общие вопросы Delphi 9 17.04.2009 17:03