有没有办法从Delphi 5编写的ActiveX dll创建MDI子窗口,并将其嵌入从Delphi XE Windows客户端应用程序创建的MDI父窗口中?如果没有,有没有办法模仿这种行为?
背景
有一个完全用Delphi 5编写的应用程序。该应用程序的主要形式是MDI父窗口。应用程序中的所有其他表单都是MDI子表单,并且每个表单都是从ActiveX库创建的。父应用程序创建ActiveX,之后调用ActiveX接口的方法。从这个方法创建一个表单,它的FormStyle设置为fsMDIChild。此时,表单是MDI父级的MDI子级。这是有效的,因为应用程序和ActiveX库都是使用运行时包编译的。因此,所有表单都共享相同的TApplication实例。
问题
应用程序非常庞大,需要迁移到Delphi 2010或Delphi XE。如果可以系统地迁移应用程序,首先迁移应用程序,然后一次迁移一个ActiveX库(其中大约有50个),这将是非常棒的。
问题是如果控制台应用程序是在XE中编译的,它将不再使用与仍在Delphi 5中编译的库相同的TApplication实例。
即使ActiveX库中的表单不能是真正的MDI子窗口,似乎我应该能够返回从ActiveX创建的表单句柄并从主表单中获取它并使表单出现成为MDI的孩子。然后我可以创建自己的图层来处理事件。
有什么想法吗?
更新:此应用程序当前采用的方法是将其从MDI迁移到SDI接口。完全可以从Delphi XE应用程序中的Delphi 5 ActiveX DLL实例化TForms,只要每个DLL的第一个表单可以处理它自己的数据(加载,保存,显示其他表单等)。问题在于保持原始的MDI设计。如果SDI设计被证明是可接受的,则不需要MDI解决方案。不过,如果有人知道如何完成MDI解决方案,我想知道。
答案 0 :(得分:4)
最初,我说你不能创造这样做。 我研究了一些,发现可以做到这一点。 你必须非常小心。
以下是我最近创建的一些来源,用于测试这个想法:http://cc.embarcadero.com/item/28168
代码生成Windows计算器和记事本应用程序,然后将外部窗口MDI化为MDI表单。
启动应用后点击启动记事本,看看会发生什么。
您应该能够进一步修改工作,以便达到您的需要。
请注意,您需要确保ActiveX DLL中的MDI Child完全独立。
答案 1 :(得分:0)
即使ActiveX中的表单 图书馆不能是真正的MDI孩子 窗户,似乎我应该 能够返回表单的句柄 这是从ActiveX和 从主表单中获取并制作 表格似乎是MDI儿童。一世 然后可以创建我自己的图层 处理事件。
我会尝试这样的事情(灵感来自马里安的评论):
在Delphi 5 MDI窗口中,为每种形式将Window拆分为两层:
在Delphi XE主机中:
这可能意味着您必须在Delphi XE中复制部分Delphi 5 MDI处理。
- 的Jeroen