Как запустить событие KeyPreview, когда в форме есть TActionMainMenuBar

Когда я устанавливаю свойство KeyPreview = TRUE в моей основной форме (родительский MDI), события OnKeyDown, OnKeyUp или OnKeyPress не запускаются. Нажимая клавиши, я могу перемещаться по главному меню (TActionMenuBar). Кажется, что в строке меню есть контроль над ключевыми событиями.

Как я могу запустить событие, когда пользователь нажимает клавишу (например, клавишу VK_RETURN)?

Я использую Delphi 2009


person markus_ja    schedule 23.02.2010    source источник
comment
Это будет непросто, потому что меню работают в собственном цикле сообщений, а ваша форма заблокирована, пока меню не будет закрыто. Что именно ты пытаешься сделать? Когда пользователь нажимает VK_RETURN, элемент меню выбирается, меню закрывается, и вы можете обрабатывать OnClick элемента меню или событие OnExecute связанного действия.   -  person Ondrej Kelle    schedule 23.02.2010
comment
Когда я нажимаю клавишу VK_Return, я хочу открыть дочернюю форму. Для быстрого доступа (вместо нажатия кнопки на панели инструментов).   -  person markus_ja    schedule 23.02.2010
comment
Я полагаю, когда вы нажимаете VK_RETURN в определенном пункте меню? В этом случае следует использовать событие OnClick пункта меню. Или, если ваш пункт меню связан с действием, используйте событие OnExecute действия. Код выполняется при выборе пункта меню, независимо от того, с помощью мыши или клавиатуры.   -  person Ondrej Kelle    schedule 23.02.2010
comment
Когда я нажимаю клавишу VK_RETURN, я не хочу взаимодействовать с меню. Когда в главной форме MDI нет открытого дочернего элемента, нажатие клавиши VK_RETURN должно просто открыть мое дочернее окно.   -  person markus_ja    schedule 23.02.2010
comment
Проблема в том, что когда меню активно, с ним нужно взаимодействовать. (Точнее, вы не можете взаимодействовать ни с чем другим в своем приложении.)   -  person Ondrej Kelle    schedule 23.02.2010


Ответы (1)


Из комментариев я вижу, что вы хотите выполнить определенное действие (например, открыть форму) при нажатии определенной клавиши.

Для этого вы можете назначить комбинацию клавиш для TAction и написать соответствующий код в TAction.OnExecute

Шаги:

  1. Бросьте TActionManager (или TActionList)
  2. Дважды щелкните по нему (появится редактор TActionManager). Нажмите кнопку «Новое действие».
  3. Установите для свойства ShortCut желаемое значение.
  4. Напишите соответствующий код в OnExecute событии.

Обратите внимание, что на шаге 3. (возможно) у вас (и, скорее всего, у ваших пользователей) возникнут проблемы с назначением клавиши Enter чему-то столь необычному, как открытие формы. «Enter» имеет очень определенное значение в Windows.

Я бы предложил назначить функциональную клавишу (обычно F2-F9) и / или Ctrl + [первая буква имени вашей формы]

HTH

person John Thomas    schedule 23.02.2010
comment
Можно ли установить клавишу ENTER как ShortCut? Я не вижу его в списке TAction.ShortCut. К вашему сведению: в нашем приложении мы часто используем клавишу ENTER. - person markus_ja; 23.02.2010
comment
да. Просто напишите это. :-) Перейдите к свойству Shortcut и введите «Enter» (без кавычек). Нажмите [Enter] (клавиша). Чтобы протестировать его, перейдите к событию OnExecute и напишите тестовый код, например ShowMessage('Boo!'); или аналогичный. Вы увидите, что этот код выполняется. Причина, по которой «Enter» не включен в этот список, заключается в том, что, как я уже сказал, его использование не рекомендуется для настраиваемых действий. К счастью, это не мой выбор или выбор Delphi, а соглашение Windows. Но если он подходит для вашего приложения, продолжайте, даже если иногда Windows его перехватывает. Протестируйте, и если работает ... - person John Thomas; 23.02.2010
comment
хм ... Я не могу установить клавишу ENTER в свойстве ShortCut в D2009. Я получаю сообщение об ошибке "Недействительное значение свойства". А в D7 работает? - person markus_ja; 24.02.2010
comment
Не знаю для D7. Просто введите Enter в D2010. И, по-моему, он должен работать и в D2009 TextToShortCut (базовый движок для этого) - это довольно старая функция Delphi. Попробуйте ввести, например, A+Ctrl внутри свойства ShortCut. Оно работает? (IDE должна принять его и изменить на Ctrl + A) - person John Thomas; 24.02.2010