1

MDI アプリケーションがあり、TActionManager を使用してアプリケーション内のアクションを管理しています。これは、MDIChild フォームのアクションが含まれていることも意味します。

私の問題を再現する簡単な例を次に示します。

2 つのフォームを含む新しい VCL フォーム アプリケーションを作成します。Form1 & Form2 Form1 に TButton と TActionManager をドロップします。TActionManager のポップアップ エディタを使用して 2 つの TAction を作成します。Form1 に FormStyle := fsMDIForm を設定します。Form2 に FormStyle := fsMDIChild を設定します。

このコードを対応するイベントに追加します。

// Form1   
procedure TForm1.Action1Execute(Sender: TObject);
begin
   ShowMessage('Action1');
end;
procedure TForm1.Action2Execute(Sender: TObject);
begin
   ShowMessage('Action2');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
   oForm2: TForm2;
begin
   oForm2 := TForm2.Create(Application);
end;

// Form 2
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   Action := caFree;
end;

Form2 に TActionToolBar をドロップします。TActionManager PopUp Editor を使用して、この TActionToolBar に Action1 と Action2 をドロップします。保存して実行します。Form1 のボタンをクリックして、Form2 を表示します。すべてが期待どおりに機能します。Form2 を閉じて、再度開きます。アクションが不足しています...

本当に TActionManager を使用する必要があることを知って、アクションが失われないようにする方法はありますか?

4

1 に答える 1

2

私は問題を最もよく理解しているように説明しようとします。

まず第一に、あなたの行動は「なくなった」のではなく切断され、まだ存在しています。つまり、ActionManager1.ActionCount は引き続き 2 を返します。

そうは言っても、設計時に行っていることは、1 つのフォーム変数のアクション リストを別のフォーム変数のツールバーに接続することです。言い換えると。Form1.ActionList は Form2.ToolBar にアタッチされています。そのため、最初に実行したときに機能し、次に TForm2 のインスタンスを作成したときに、デフォルトで作成された Form2 ではなくなり、変数 Form1 に接続されません。これは長年にわたる私の最善の推測であり、DataModules で同様の問題を経験しました。

私の答えは、子フォームにアクション リストを配置することです。すべての子フォームでアクションを共有する必要がある場合は、アクション リストとツールバーが MDI 親に属します。これは、MDI アプリではかなり標準的です。

于 2012-06-05T18:31:19.333 に答える