7

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

4

2 回答 2

4

原来,我说你不能创造这样做。我研究了更多,发现这是可能的。你必须非常小心。

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

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

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

您应该能够进一步修改工作,以便您可以实现您所需要的。

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

于 2010-12-14T09:18:13.693 回答
0

即使 ActiveX 库中的窗体不能是真正的 MDI 子窗口,似乎我应该能够返回从 ActiveX 创建的窗体的句柄并从主窗体中获取它并使窗体看起来像一个MDI 孩子。然后我可以创建自己的层来处理事件。

我会尝试这样的事情(受 Marjan 评论的启发):
在 Delphi 5 MDI 窗口中,将每个表单的窗口分成两层:

  • 一组具有内容的无框架 TForms/TFrames(可能将其公开为 ActiveX 表单)
  • 对于每个无框架内容,一个处理 MDI 的 MDI 子级

在 Delphi XE 主机中:

  • 获取每个 Delphi 5 无框架 TForms/TFrames 的句柄
  • 将该句柄嵌入到 MDI 子窗体中

这可能意味着您必须在 Delphi XE 中复制 Delphi 5 MDI 处理的一部分。

——杰伦

于 2010-12-16T07:29:13.417 回答