2011-11-09 14 views
2

次のメソッドを使用して、実行時にアクションを持つ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; 

これは、リスト内の項目がすでに存在する場合に正常に動作しますが、

例えば存在しない場合には全く動作しません。私は設計時に項目を追加した場合、私はランタイム

enter image description here enter image description here

で複数の項目を追加することができます。しかし、私は設計時には何も追加しない場合は、項目のリストを表示するには、noドロップダウンをtheresの、アイテムを追加した後にドロップダウンは表示されません。

enter image description here

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

のDelphi 2005

+0

ほんの少しの発言: 'ActionClient.Caption'の設定は、アクションの値と同じ値に設定すると余計です。 – NGLN

答えて

2

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

実行時に最初の子アイテムが追加されると、ボタンのタイプが間違っています。そのボタンのタイプを変更するには、現在のボタンを破棄し、新しいボタンを完全かつ手動でインスタンス化する必要があります。これは可能なはずですが、ので、試していません:本当に最も簡単な解決策は、設計時に子アイテムを追加することにより、VCLをだますために、フォームの作成時にその項目を削除することです

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    aToolBarFile.ActionClient.Items[0].Items[0].Free; 
end; 
+1

悪い考えではありません。私はプロダクションコードにコメントをつけ、デザインアイテム "Placeholder 001"かそのようなものを呼び出します。 –

+0

@Warrenはい、確かに何らかの説明が必要です。 – NGLN

0

"context"タイプのactionclientを作成すると、ボタンタイプを変更する必要はありません。メニューを右クリックすると、メニューがドロップダウンします。

+0

これは良い解決策のように思えます。正確にこれを行う方法を詳しく教えてください。 DelphiのバージョンはVCLでこれが可能ですか? – NGLN

関連する問題