2

次のメソッドを使用して、実行時に Action を持つ ActionClient を作成しています。

procedure TMainForm.AddToProjectHistory(Path: string);
var
    NewOption: TAction;
    ActionClient: TActionClientItem;
begin
    NewOption := TAction.Create(self);
    NewOption.ActionList := ActionManager1;
    NewOption.Caption := Path;
    NewOption.OnExecute := ProjectHistoryExecute;
    ActionClient := TActionClientItem(aToolBarFile.ActionClient.Items[0].Items.Add);
    ActionClient.Action := NewOption;
    ActionClient.Caption := Path;
end;

これは、リストに項目が既に存在する場合は正常に機能しますが、存在しない場合はまったく機能しません

たとえば、設計時に項目を追加すると、実行時にさらに項目を追加できます

ここに画像の説明を入力 ここに画像の説明を入力

しかし、設計時に何も追加しないと、アイテムのリストを表示するドロップダウンがなく、アイテムを追加した後にドロップダウンが表示されません。

ここに画像の説明を入力

これはアクションで行う必要はありませんが、メニュー システムの残りの部分はアクションを使用するため、アクション ドロップダウンに標準の MenuItem を追加することはできないと思います。

デルファイ 2005

4

2 に答える 2

2

VCLは、アイテムに子要素があるかどうかに応じて、タイプのボタンコントロールを自動的に作成します。デフォルトでは(そしてActionManagerのスタイル設定に応じて)、子アイテムを持つActionClientItemの場合はTXPStyleDropDownBtnボタンが作成され、子のないActionClientItemの場合はaTXPStyleButtonが作成されます。

したがって、実行時に最初の子アイテムが追加されると、ボタンのタイプが間違っています。そのボタンのタイプを変更するには、現在のボタンを破棄し、新しいボタンを完全に手動でインスタンス化する必要があります。これは可能であるはずですが、次の理由で試していません。

本当に最も簡単な解決策は、設計時に子アイテムを追加してVCLをだまし、フォームの作成時にそのアイテムを削除することです。

procedure TForm1.FormCreate(Sender: TObject);
begin
  aToolBarFile.ActionClient.Items[0].Items[0].Free;
end;
于 2011-11-09T19:33:48.163 に答える