Как получить ярлыки для работы с несколькими объектами TActionMainMenuBar в одной форме? - PullRequest
5 голосов
/ 06 ноября 2008

У меня есть приложение с основной формой. В этой форме я поместил три TActionMainMenuBars, потому что приложение по сути работает в трех разных режимах.

Все строки меню построены из действий, сохраненных (проксированных) в TActionManager в главной форме. ActionManager фактически ссылается на списки действий в различных других формах.

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

Проблема, однако, в том, что действия, похоже, не реагируют на нажатие клавиш.

Кто-нибудь знает, что может быть причиной того, что действия не срабатывают?

Я с радостью предоставлю больше информации, если необходимо, я программирую на C ++ Builder 2007 RAD Studio в WinXP SP3.

Спасибо всем, кто читает это или даже читает это и предлагает решение!

PeterMJ

Обновление: Мне не удалось заявить, что ярлыки в разных меню перекрываются в том, что одни и те же ярлыки используются в разных меню для разных действий, но все ярлыки уникальны в собственном меню.

С тех пор я также упростил задачу в тестовом приложении с двумя TActionMainMenuBars, и все действия совместно использовали один диспетчер действий. В этом случае у меня есть два действия с одним ярлыком. Они размещены в разных меню. Тогда одно меню включается одновременно. В этом случае ярлыки работают, НО при использовании общего ярлыка запускается только действие в первом меню, даже , когда меню удержания отключено.

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

Ответы [ 2 ]

3 голосов
/ 05 мая 2009

Включение / отключение или отображение / скрытие ActioneMenuBar не имеет последствий для действий в строке меню. Если вы хотите сделать некоторые действия недоступными в определенном контексте / ситуации, вам нужно реализовать событие «OnUpdate» либо самого действия, либо списка действий, либо менеджера действий, частью которого он является.

Например, используя следующее событие OnUpdate вашего диспетчера действий, вы можете использовать TCheckBox, чтобы решить, какое из двух действий в данный момент активировано.

  if CheckBox1.Checked then
  begin
    Action1.Enabled:= False;
    Action2.Enabled:= True;
  end
  else
  begin
    Action1.Enabled:= True;
    Action2.Enabled:= False;
  end;

Представьте, что обоим действиям назначен ярлык "Ctrl + A", это будет означать, что нажатие Ctrl + A активирует Action1 только тогда, когда CheckBox1 не отмечен.

Однако проблема все еще существует. VCL прекратит поиск действий с определенным ярлыком, как только обнаружит действие с ярлыком в диспетчере действий или списке действий в текущей форме, даже если найденное действие не включено.

Чтобы решить эту проблему, вы можете использовать событие OnUpdate для динамической установки и сброса свойства ShortCut таких действий:

  if CheckBox1.Checked then
  begin
    Action1.Enabled:= False;
    Action1.ShortCut:= scNone;

    Action2.Enabled:= True;
    Action2.ShortCut:= ShortCut(ord('A'), [ssCtrl]);
  end
  else
  begin
    Action2.Enabled:= False;
    Action2.ShortCut:= scNone;

    Action1.Enabled:= True;
    Action1.ShortCut:= ShortCut(ord('A'), [ssCtrl]);
  end;

Используя этот код, нажатие Ctrl + A активирует Action2, если CheckBox1 отмечен, и активирует Action1, если CheckBox1 не отмечен. Вам не нужно явно вызывать событие OnUpdate списка действий или менеджера действий. Событие запускается регулярно, когда приложение находится в режиме ожидания и ожидает ввода пользователя.

0 голосов
/ 07 ноября 2008

Убедитесь, что действия, которые вы хотите использовать, действительно включены.
Если при отключении панели вы отключите все действия внутри ActionMainMenuBar, у вас возникнет проблема.
Обязательно используйте доступные ярлыки, не конфликтующие с глобальными ярлыками Windows.
Кроме этого я не понимаю, почему это не сработает. Я попытался с 2 ActionMainMenuBars в Delphi, и ярлыки сработали.

...