1

我有一个 MDI 应用程序,我正在使用 TActionManager 来管理我的应用程序中的操作,这也意味着它包含我的 MDIChild 表单的操作。

这是一个重新创建我的问题的简单示例:

使用 2 个表单创建一个新的 VCL Forms 应用程序。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;

将 TActionToolBar 拖放到 Form2 上。使用 TActionManager 弹出编辑器将 Action1 和 Action2 放在此 TActionToolBar 上。保存并运行。单击 Form1 上的按钮以显示 Form2。一切都按预期工作。现在关闭 Form2 并重新打开它。缺少动作...

知道我真的需要使用 TActionManager,有没有办法避免丢失我的操作?

4

1 回答 1

2

我将尽我所能解释这个问题。

首先,你的行为是断开的而不是“消失”,它们仍然存在。换句话说,ActionManager1.ActionCount 仍然会返回 2。

话虽如此,您在设计时所做的是将一个表单变量上的操作列表与另一个表单变量上的工具栏连接起来。换句话说。Form1.ActionList 被附加到 Form2.ToolBar。这就是为什么它在您第一次运行时起作用,下次您创建 TForm2 的实例时,它不再是默认创建的 Form2,因此不会连接到变量 Form1。这是我多年来最好的猜测,我在使用 DataModules 时也遇到过类似的问题。

我的回答是,将动作列表放在子表单上。如果您需要在所有子窗体之间共享操作,则操作列表和工具栏属于 MDI 父窗体。这对于 MDI 应用程序来说是相当标准的。

于 2012-06-05T18:31:19.333 回答