Есть ли способ переопределить предыдущие зарегистрированные действия с помощью ярлыка? - PullRequest
2 голосов
/ 23 октября 2009

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

Теперь у меня есть глобальное немодальное диалоговое окно (называемое objectinspector), которое можно запустить в любое время в любом месте. У него есть некоторые действия с ярлыками, которые совпадают с другими местами в модулях.

Поэтому я хочу временно переопределить те действия, которые имеют одинаковые ярлыки, когда объектинспектор активен, и отменить его при деактивации.

У меня есть этот код в событии OnActivate objectinspectors:

  ClientActions.RegisterAction(ClientActions.actObjectInspectorNewWindow, ShowNewObject);
  • ClientActions - это блок, содержащий действия.
  • RegisterAction - это метод, который связывает событие с действием.
  • actObjectInspectorNewWindow - это фактическое действие.
  • ShowNewObject - это событие, которое должно вызываться при выполнении действия.

Таким образом, для каждого модуля и немодального диалога есть пара действий, которые регистрируются вышеуказанным методом. Проблема возникает, когда 2 действия имеют один и тот же ярлык. Кажется, что действия, которые сначала регистрируются, выигрывают и выполняются, когда пользователь нажимает на ярлык. Я предпочел, чтобы последнее действие, которое регистрирует действие с этим ярлыком, было выполнено.

Как это можно сделать?

Привет

Ответы [ 2 ]

3 голосов
/ 27 октября 2009

если действия находятся в одном TActionList, вы должны назначить scNone для действия, которое вы хотите отключить, а затем назначить ярлык для нового действия. Пример:

acEditCopy.Enabled:=False;
acEditCopy.ShortCut:=scNone;

acShowCalculator.Enabled:=True;
acShowCalculator.ShortCut:=ShortCut(Ord('C'), [ssCtrl])

Таким образом, код, который проверяет, соответствует ли указанная клавиша ярлыку в ActionList, не прерывается, когда он находит первый назначенный ярлык. Надеюсь, это поможет вам, эта штука свела меня с ума около месяца назад. : -)

1 голос
/ 27 октября 2009

Если я правильно понимаю ваш вопрос, у вас есть более одного TActionList в вашем приложении. Действия в разных списках действий могут использовать одну и ту же комбинацию клавиш. Вы хотите контролировать, какое действие выполняется, когда

Я бы сделал так, чтобы назначить обработчик события OnShortCut формы. В этом обработчике событий вызовите TActionList.IsShortCut () в порядке приоритета, который вы хотите иметь в своих списках действий. Когда TActionList.IsShortCut () возвращает True, установите для параметра Handled OnShortCut значение True и выйдите. Когда TActionList.IsShortCut () возвращает True, он фактически выполнил действие.

...