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

时间:2010-12-10 19:38:58

标签: 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解决方案,我想知道。

2 个答案:

答案 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拆分为两层:

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

在Delphi XE主机中:

  • 获取每个Delphi 5无框架TForms / TFrames的句柄
  • 在MDI子表单中嵌入该句柄

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

- 的Jeroen