Как программно добавить действия в Action Manager в Delphi 2010 - PullRequest
2 голосов
/ 26 ноября 2010

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

HostActionItem := ActionManager.ActionBars[0].Items[0].Items[2];
  NewItem := HostAction.Items.Add;
  NewItem.Action :=  MyActionToPerform;
  NewItem.Caption := Description;
  NewItem.ImageIndex := 1;
  NewItem.Tag := 13;

Однако, когда срабатывает метод Execute, я пытаюсь получить ActionComponent от Отправителяобъект, подобный этому:

  if (Sender is TAction) then
  tag := (Sender As TAction).ActionComponent.Tag;

Но ActionComponent всегда равен нулю.Почему ActionComponent не инициализируется?

1 Ответ

5 голосов
/ 26 ноября 2010

короткий ответ:

Вы ожидаете, что TActionClientItem будет отображаться как ActionComponent из TAction.Этого не произойдет, поскольку TActionClientItem не происходит от TComponent.

более длинный ответ:

Я полагаю, вы добавляете свой элемент в строку меню,Кажется, по замыслу TAction, связанный с элементом меню, не будет поддерживать ActionComponent.Элементы строки меню имеют тип TActionClientItem.Это «элемент коллекции», а не «компонент».Следовательно, меню не может заполнить параметр ActionComponent элементом меню при вызове метода Execute ссылки действия выбранного элемента.Если это звучит странно, я думаю, что приведенные ниже цитаты из источника VCL прояснят:

TBasicActionLink.Execute метод:

function Execute(AComponent: TComponent = nil): Boolean; virtual;

Переданный компонент назначается FAction.ActionComponent перед

Как это вызывается из TCustomActionMenuBar.ExecAction:

FSelectedItem.ActionLink.Execute;

Что касается вопроса в заголовке, я не думаю, что вы делаете что-то не так, кроме установки Caption и ImageIndex для TActionClientItem не нужны, так как будут отображаться заголовок и изображение TAction.

...