1

私は VCL プログラムを開発しており、ファイルのグループを一覧表示する [最近使用したファイル] ドロップダウン サブメニューを配置するためのコードを追加しています。このプログラムでは、tActionManager と tActionMainMenuBar を設定しました。FormCreate イベント プロシージャで最近のファイル サブメニュー項目のリストを生成する標準 tMainMenu コンポーネントで tmenuitems を使用する前に、同様のメニューを作成しました。ただし、アクション コンポーネントを使用してこれを動的に実行する方法が不明であり、モデルとして役立つ例が見つかりませんでした。

誰でもこれがどのように行われるかの例を提供できますか

4

1 に答える 1

3

これを説明するために、アクション マネージャを TActionMainToolBar として持つ単純なアプリケーションを作成し、標準項目の [開く]、[名前を付けて保存]、および [終了] (セパレータなし) と速度ボタンを使用する単純なファイル メニューを追加しました。

速度ボタンは 2 つのセパレーターとファイル アクションを追加し、その OnClick イベントは次のようになります...

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  iActionClientItem : TActionClientItem;
  iFileAction : TCustomAction;
begin
  //  Edit2.Text := BaseToBase( Edit1.Text, SpinEdit1.Value , SpinEdit2.Value );
  ActionManager1.AddSeparator( ActionManager1.FindItemByAction(FileExit1), FALSE );
  iActionClientItem := ActionManager1.AddSeparator( ActionManager1.FindItemByAction(FileExit1) );
  iFileAction :=  TCustomAction.Create( self ); // we want to put in same collection
  iFileAction.Caption := 'Fred';
  // etc.. to build what is wanted
  iActionClientItem := ActionManager1.AddAction( iFileAction, iActionClientItem )  ;
end;

プログラムを実行してファイル メニューを開くと、予想される 3 つのエントリが表示されます。ボタンをクリックすると (2 回クリックしないでください。動作を説明するだけです)、2 つの区切り記号と、「Fred」というキャプションを持つ新しいメニュー サブ項目が表示されます。あなたはそれを処理する必要があります。

編集

サブメニューの作成は、基本的に同じ方法で行うことができますが、アクション マネージャーを使用せずに、未使用の非表示アイテムを追加するというちょっとしたトリックが必要です。このようにする必要はありません。必要なものを取得するための簡単な方法です。

このコードは、これを実現する方法を示しています。

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  iActionClientItem : TActionClientItem;
  iSubMenuItem : TActionClientItem;
  iFileAction : TCustomAction;
  iChildMenu : TActionBarItem;
begin
  ActionManager1.AddSeparator( ActionManager1.FindItemByAction(FileExit1), FALSE );
  iActionClientItem := ActionManager1.AddSeparator( ActionManager1.FindItemByAction(FileExit1) );
  iFileAction :=  TCustomAction.Create( self ); // we want to put in same collection
  iFileAction.Caption := 'Fred';
  // etc.. to build what is wanted
  iActionClientItem := ActionManager1.AddAction( iFileAction, iActionClientItem )  ;

  //*********************************
  // Build sub menu (from Fred) - stage 1 add the visual element - a new action bar
  iChildMenu :=  ActionManager1.ActionBars.Add;
  iActionClientItem.ChildActionBar := iChildMenu.ActionBar;

  // we add a dummy entry that we can build from.
  // We could set the properties manually, but when we use the action manager
  // it does that automatically, so it is easier just to set this item to not visible
  // then use action manager to do the rest.
  iSubMenuItem := iActionClientItem.Items.Add;
  iSubMenuItem.Visible := FALSE;

  // Now the real build...

  iFileAction :=  TCustomAction.Create( self ); // we want to put in same collection
  iSubmenuItem := ActionManager1.AddAction( iFileAction, iSubMenuItem );
  iSubmenuItem.Caption := 'Fred 1';
  // etc

  iFileAction :=  TCustomAction.Create( self ); // we want to put in same collection
  iSubmenuItem := ActionManager1.AddAction( iFileAction, iSubMenuItem );
  iSubmenuItem.Caption := 'Fred 2';
  // etc
end;
于 2017-11-28T11:14:48.973 に答える