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