为DELPHI应用程序实现外部模块系统的最佳方法是什么?
我真正需要的是非常基本的:
我需要在其他表单中使用商店表单,并且只能作为standAlone
使用我使用类似的东西
if Assigned(pNewClass) then begin
Application.CreateForm(pNewClass, _lFrm);
_lFrm.Hide;
_lFrm.BorderStyle := bsNone;
_lFrm.Parent := pBasePNL //(TPanel);
_lFrm.Align := alClient;
end;
所以我创建了一个TForm,但是把它放在TPanel中。
对于DataModules,我通常存储ImageLists,因此ideia是改变应用程序ICO只是改变外部模块。
那么实现这一目标的最佳方法是什么?
查看运行时BPL,但似乎并不了解如何执行此操作。 感谢。
更新:..................................... 的
在阅读了一些相关的问题和答案后,我想我找到了答案和解决方案。
http://edn.embarcadero.com/article/27178
这篇文章很古老但很简单。
那么逻辑就在那里我似乎没有把它展示给表格
我只是在测试示例2
它加载BPL,但没有得到Form:
AClass := GetClass('TForm2');
始终检索'nil'
但BPL注册时:
RegisterClass(TForm2);
任何人都可以帮助这个。
答案 0 :(得分:4)
软件包是一个简单的解决方案,但它们有一个巨大的缺点。使用包强制插件作者不仅使用Delphi,而且使用与您相同版本的编译器。
我个人更愿意通过许多界面公开应用程序的功能。这允许使用Delphi以外的语言进行访问。
通常,插件将在DLL中实现,并将导出应用程序将在代表应用程序的根界面中调用的函数。然后,插件将调用该接口的方法,从而建立双向交互。
答案 1 :(得分:3)
我为你做了一个演示,它很容易上手!但是......开始还没完成。
每次我开始使用插件时,我后来后悔了。但是,正如您所说,您需要一个二进制插件系统。所以BPL是正确的解决方案。 David建议使用接口(使用普通的DLL而不是完整的运行时包BPL),这样可以解决一些常见的BPL不稳定性问题,因为不对类进行版本控制,从而解决了应用程序和包 - 二进制兼容性依赖关系,正常。如果您不需要共享内存而不需要使用borlandmm.dll(共享内存管理),那么带接口的直接DLL将正常工作。
如果您只需编写脚本就能完成所有操作,并使用脚本制作插件系统,那么就这样做。如果你可以逃脱DLL,接口和没有内存共享,那么使用普通的DLL。如果你必须共享内存和类类型,那么是的,使用BPL。
请注意,使用BPL(运行时软件包)会带来许多您可能没有预料到的副作用。我工作过的最大的基于BPL的应用程序比我工作的任何单片应用程序更糟糕,更不稳定。似乎只有在你尝试它们之前才能松开包装,然后我发现,我再次松开了整块石头。
如果您正确使用BPL包,并且正确地对插件进行了版本化,那么一切都很好。 BPL很棒。但在现实世界中,似乎理智的版本控制和ABI兼容性和互操作性以及稳定性都非常重要。
更新:我为您制作了一个演示here(plugin_r2.zip)。它是在Delphi XE中完成的,但是如果您使用的是旧版本的delphi,则只需删除.dproj文件并打开主应用程序的.dpr文件和包的.dpk文件。