MDI应用程序中的TActionManager。失去行动

时间:2012-06-05 17:32:07

标签: delphi delphi-xe2 mdi taction tactionmanager

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

这是一个简单的例子来重现我的问题:

使用2个表单创建一个新的VCL Forms应用程序。 Form1&窗体2 在Form1上删除TButton和TActionManager。 使用TActionManager的PopUp编辑器创建2个TATION。 为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。 保存&跑。 单击Form 1上的按钮以显示Form 2。 一切都按预期工作。现在关闭Form2并将其打开。 行动不见了......

有没有办法避免失去我的行为知道我真的需要使用TActionManager?

1 个答案:

答案 0 :(得分:2)

我将尽力解释这个问题。

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

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

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