Краткий ответ: ярлыки действий не автоматически запускаются через формы и модули данных.
Если вы будете следовать инструкциям, приведенным в вопросе, вы обнаружите, что даже первичные короткие пути не срабатывают. Это потому, что ключевой шаг был исключен из инструкций. Тот, который будет объяснять, почему ОП испытал первичное короткое замыкание, а не вторичное.
Если вы включите дополнительные шаги:
- Добавить меню в форму.
- И связать пункт меню с действием.
Тогда основной короткий путь сможет запустить действие. Это связано с тем, что компонент Action передает свои настройки в пункт меню (включая свойство ShortCut
). Однако TMenuItem
не реализует концепцию вторичных сокращений. Вот почему один работает, а другой нет.
Пауза для рассмотрения приложения с множеством форм и модулей данных; и следствие того, что быстрые сокращения действий могут сработать во всех из них. Должно быть совершенно очевидно, что они не могут автоматически запускать без явного кода, разрешающего это. Вы не хотели бы, чтобы фоновая форма выполняла кучу вещей, потому что ее настроенные сочетания клавиш оказывались нажатыми в контексте другой не связанной работы.
Документация указывает на преимущества размещения списков действий на модулях данных. Но, похоже, не дается никакого объяснения, как правильно использовать действия с ярлыками для модуля данных . Конечно, ничего не упоминается в ожидаемых местах, а именно: ShortCut и SecondaryShortcuts . (Я был бы разочарован, но мои ожидания в отношении достойной документации оказались довольно низкими.)
Итак ...
Что нужно сделать , чтобы получить действия с ярлыками, работающими с формами и модулями данных?
Я провел небольшое исследование и нашел несколько вариантов. Как всегда, оцените компромисс относительно того, чего вы пытаетесь достичь.
Когда вы опускаете список действий в (неосновной) форме, все ярлыки работают должным образом. Это наиболее распространенный сценарий и применяется, когда действия являются локальными и имеют специфическую форму.
Когда вы опускаете список действий в главной форме, все эти ярлыки могут запускаться из любой другой формы. Это отлично подходит для ярлыков во всем приложении, таких как открытие других форм.
ПРИМЕЧАНИЕ: Существует последовательность приоритетов в отношении того, где сначала проверяется сокращение. Таким образом, если активная форма имеет ярлык, совпадающий с соответствующим на главной форме, ярлык будет обрабатываться локально. И основная форма по понятным причинам не получит.
- Когда форма проверяется, чтобы проверить, обрабатывает ли она ярлык, также проверяются все принадлежащие компоненты . (По сути, именно поэтому первые два выше работают.) Это означает, что простая установка
Owner
вашего модуля данных позволит соответствующим образом применить его ярлыки к выбранной вами форме.
т.е. Вместо:
Application.CreateForm(TDataModule1, DataModule1);
Вы можете использовать следующее:
DataModule1 := TDataModule1.Create(LocalForm);
Однако, поскольку у каждого экземпляра модуля данных может быть только один владелец: вам придется создать несколько экземпляров, чтобы позволить нескольким формам совместно использовать ярлыки. Будет ли это вариант, зависит от ваших обстоятельств. Однако вы также можете сделать основную форму владельцем вашего модуля данных, что будет в некоторой степени эквивалентно второму варианту, приведенному выше.
- Последний вариант, обеспечивающий максимальный контроль, - это собственный ответ ОП. То есть Любая форма, которая должна поддерживать «внешние ярлыки», может обрабатывать событие OnShortCut с помощью следующего кода:
Как видно из примера кода, вы можете делегировать несколько списков действий в разных местах в соответствии с выбранным вами приоритетом.
procedure TMyForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
Handled := DataModule1.ActionList3.IsShortCut(Msg);
Handled := Handled or DataModule2.ActionList1.IsShortCut(Msg);
Handled := Handled or DataModule1.ActionList1.IsShortCut(Msg);
end;