我有一个MDI应用程序,我正在使用TActionManager来管理应用程序中的操作,这也意味着它包含了我的MDIChild表单的操作。
这里有一个简单的例子来重现我的问题:
创建具有2个表单的新VCL表单应用程序。Form1 & Form2在Form1上丢弃了一个TButton和一个TActionManager。使用TActionManager的PopUp编辑器创建2个TActions。为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编辑器将Action1和Action2放在此TActionToolBar上。保存并运行。单击Form1上的按钮以显示Form2。一切都按预期运行。现在关闭Form2并重新打开它。缺少操作...
知道我真的需要使用TActionManager,有没有办法避免丢失我的操作?
发布于 2012-06-06 02:31:19
我将尽我所能地解释这个问题。
首先,你的行动是断开的,而不是“消失”,它们仍然存在。换句话说,ActionManager1.ActionCount仍将返回2。
也就是说,您在设计时所做的是将一个表单变量上的操作列表与另一个表单变量上的工具栏连接起来。换句话说。Form1.ActionList正在附加到Form2.ToolBar。这就是为什么它会在您第一次运行时工作,下一次创建TForm2实例时,它不再是默认创建的Form2,因此不会连接到变量Form1。这是我多年来最好的猜测,我在DataModules上也遇到过类似的问题。
我的答案是,将操作列表放在子窗体上。如果需要在所有子窗体之间共享操作,则操作列表和工具栏属于MDI父窗体。这对于MDI应用程序来说是相当标准的。
https://stackoverflow.com/questions/10902040
复制相似问题