如何从Delphi 5 ActiveX dll创建MDI子窗口,并将其嵌入Delphi XE MDI父级?

Car*_*sen 7 delphi winapi activex delphi-xe

有没有办法从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解决方案,我想知道.

chu*_*acw 4

最初,我说过你不能这样做。我进行了更多研究,发现可以做到这一点。但你必须非常小心。

这是我最近创建的一些来源来测试这个想法:http://cc.embarcadero.com/item/28168

该代码生成 Windows 计算器和记事本应用程序,然后将外部窗口 MDIize 到 MDI 窗体中。

启动应用程序后单击“启动记事本”,看看会发生什么。

你应该能够进一步修改工作,以便达到你需要的效果。

请注意,您需要确保 ActiveX DLL 中的 MDI 子级是完全独立的。