gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:54:10 24 4
gpt4 key购买 nike

有没有办法从用 Delphi 5 编写的 ActiveX dll 创建 MDI 子窗口,并将其嵌入到从 Delphi XE Windows 客户端应用程序创建的 MDI 父窗口中?如果没有,有没有办法模仿这种行为?

背景

有一个完全用 Delphi 5 编写的应用程序。该应用程序的主要窗体是 MDI 父窗口。应用程序中的所有其他窗体都是 MDI 子窗体,并且每个窗体都是从 ActiveX 库创建的。父应用程序创建 ActiveX,然后调用 ActiveX 接口(interface)的方法。通过此方法创建一个表单,并将其 FormStyle 设置为 fsMDIChild。此时,该窗体是 MDI 父级的 MDI 子级。这是可行的,因为应用程序和 ActiveX 库都是使用运行时包编译的。因此,所有表单共享同一个 TApplication 实例。

问题

应用程序非常大,需要迁移到Delphi 2010或Delphi XE。如果可以通过首先迁移应用程序,然后一次迁移一个 ActiveX 库(大约有 50 个)来系统地迁移应用程序,那就太棒了。

问题是,如果控制台应用程序在 XE 中编译,它将不再使用与仍在 Delphi 5 中编译的那些库相同的 TApplication 实例。

即使ActiveX库中的表单不能是真正的MDI子窗口,似乎我应该能够返回从ActiveX创建的表单的句柄并从主表单中获取它并使表单出现成为 MDI child 。然后我可以创建自己的层来处理事件。

有什么想法吗?

<小时/>

更新:此应用程序当前采用的方法是将其从 MDI 迁移到 SDI 接口(interface)。完全有可能从 Delphi XE 应用程序中的 Delphi 5 ActiveX DLL 实例化 TForms,只要每个 DLL 中的第一个表单可以处理它自己的数据(加载、保存、显示其他表单等)。问题在于如何保留原来的 MDI 设计。如果 SDI 设计被证明是可以接受的,那么就不需要 MDI 解决方案。不过,如果有人知道如何完成 MDI 解决方案,我想知道。

最佳答案

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

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

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

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

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

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

关于delphi - 如何从 Delphi 5 ActiveX dll 创建 MDI 子窗口,并将其嵌入到 Delphi XE MDI 父窗口中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4412618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com