2

アクションアイテムを動的に追加しようとしています。アイテムを追加でき、これを行うと機能します。

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 メソッドが起動すると、次のように Sender オブジェクトから ActionComponent を取得しようとします。

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

しかし、ActionComponent は常に nil です。ActionComponent が初期化されていないのはなぜですか?

4

1 に答える 1

5

簡潔な答え:

が の時点でTActionClientItem表示されることを期待しています。の子孫ではないため、それは起こりません。ActionComponentTActionTActionClientItemTComponent

より長い答え:

アイテムをメニュー バーに追加していると思います。TActionメニュー項目にリンクされた が をサポートしないように設計されているようActionComponentです。メニューバーの項目はタイプTActionClientItemです。これは「コンポーネント」ではなく「コレクション アイテム」です。したがって、メニューは、選択された項目のアクション リンクのメソッドをActionComponent呼び出すときに、メニュー項目でパラメーターを入力できません。Executeこれが紛らわしいと思われる場合は、VCL ソースからの以下の引用が明確になると思います。

TBasicActionLink.Execute方法:

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

FAction.ActionComponent渡されたコンポーネントは、実行される前に割り当てられます。

からの呼び出し方法TCustomActionMenuBar.ExecAction:

FSelectedItem.ActionLink.Execute;

タイトルの質問については、表示されるのはのタイトルと画像なので、aのCaptionとを設定する必要がないことを除けば、あなたは何も悪いことをしているとは思いません。ImageIndexTActionClientItemTAction

于 2010-11-26T17:29:31.043 に答える