我试图在用这些软件包编译我的应用程序之前开始创建我自己的库作为软件包,从而模块化我的代码。多年来,我有点'了解'包装,当我加载组件包并点击“安装”时它会松一口气,而且确实如此。我知道安装组件(或组件)的过程是通过创建BPL然后在IDE中注册。
我开始迷路的地方是如何使文件可用,以便我可以使用EITHER编译包或预编译的dcu(就像第三方供应商那样)并且不会始终将我的项目指向源代码。我可以使用以下设置创建包:
我指定我的所有输出都将进入'c:\ scratch \ wow'。在构建之后,我找到了TEST.BPL,TEST.DCP和许多DUC。现在,当我指向此文件夹中的另一个项目以使用DCU时,我得到一个缺少的DFM错误(其中一个单位是一个表单)。我应该手动将所需的DFM复制到此输出文件夹中吗? DPK知道这个表格,为什么我没有为我复制DFM?我假设使用TEST.BPL,该文件包含所有内容,但我希望在两种模式下工作。当然,我可以通过在我的项目搜索路径中包含源文件夹来找到DFM来解决这个问题,但是第三方库似乎已经在其输出文件夹中有了DFM。他们是否使用安装程序在那里安装它们? 感谢
而不是
答案 0 :(得分:9)
正如其他人所说,您可以使用构建后事件将DFM文件复制到位。其他人使用一次性外部批处理文件将DFM复制到DCU文件夹。
就我个人而言,我认为将未开发的产品包装成可重复使用的组件的好处很少。当你不合理地需要多次使用相同的子部分或包,或者在设计时,我也看到将现有应用程序划分为包的好处很少。
我会把它放到包装中:
Delphi视觉和非视觉组件。
绝对必须在运行时插入或遗漏的东西。例如,假设我销售MetaWare Light和MetaWare Pro,而不是使用编译器IFDEF来构建不同的二进制文件,出于某种原因,我倾向于不使用我的系统发送ADVANCEDFEATURE.BPL。
包裹要注意的事项:
在将包与泛型组合时,我遇到了很多编译器错误。在Delphi 2009,2010,XE和XE2中,我也遇到了IDE崩溃和锁定。 (我相信XE3更好)
在转移到BPL世界之前,您应该先了解一下BorlandMM.dll和共享内存管理。有一些细微之处。
包限制了链接器决定删除内容的能力。事实上,它几乎毁了它。包中包含链接到它们的所有内容,并且可以删除任何可公开访问的内容。
一旦你创建了一个二进制包并将它发送给一个客户,你很难修改合同(这个BPL包含一个特定的签名或应用程序二进制接口)你将来必须要小心永远不要改变它们,或混合搭配它们。谨防DLL地狱,即使是在您自己的客户中,也要准备好在您的软件包上使用版本控制。正如delphi软件包具有版本后缀一样,我建议您立即在自己的软件包中使用版本后缀,并在二进制兼容性发生变化时使用它们。
Delphi处理包之间的构建依赖关系,这可能是希望的,这不如单个单一应用程序好。在我大量使用软件包的应用程序中,我发现包含一堆彼此依赖的软件包的项目组很难快速管理和构建。事实上,我经历过,编译和构建都比单个750Kline大型项目更慢,更令人沮丧。
我真的很想知道你是不是进入了Delphi的软件包领域(如果你真的想要完全进入软件包世界,那么只要delphi组件真正构建和安装没有问题,你就会松一口气吗?)无论如何,你应该试验一下。但我不打赌它的农场。先了解一下。
答案 1 :(得分:5)
是的,您应该将.dfm复制到包含已编译单元(.dcus)的目录,如果这是您在搜索路径中所需的唯一目录。 BPL当然包含.dfms,你需要一个.dcp才能将BPL与你的应用程序链接。
第三方工具必须使用安装程序将.dfms与.dcus一起放在目录中。
答案 2 :(得分:2)
不是手动复制* .DFM,而是可以使用Post-Build Event(项目/选项/构建事件),例如:
copy “$(PROJECTDIR)\Unit1.DFM” “c:\Scratch\wow\Unit1.DFM”
答案 3 :(得分:0)
我找到了一种方法,可以在不将.dfm文件移动到.dcu文件目录的情况下执行此操作,因此您只能为.dcu文件创建一个目录,仅限.dcp文件,另一个仅用于.bpl文件。
您需要做的就是像我一样在您的良好结构上创建另一个目录。该目录名为RES,其中应放置使用您的软件包(组件)编译的应用程序使用的所有资源文件(.res文件,而不是.dcr文件)。在Delphi库路径中,除了DCU目录(您应该已经拥有)之外,还必须包含名为RES的目录。
在您的组件(设计时)上,使用表单完成所需的一切(设计,放置其他组件等)。在单元的源代码中,用{$ R UnitName.dfm}替换{$ R * .dfm}。这样做,保存所有并关闭DPK。现在将.dfm文件(不要复制,移动!)移动到RES文件夹(.dfm文件是Delphi的资源文件。{$ R}指令是证明!)然后再打开DPK来理解发生了什么变化。
首先意识到你可能不会从他的单位打开表格(F12),尽管Delphi没有发出关于“DFM缺失”的错误。
现在,在您的包上执行Build,然后安装它。又实现了吗?没有显示错误!发生这种情况是因为您在Delphi库搜索路径(RES目录)中指明了.dfm文件的位置。
完成!您可以使用组件,并在组件包含在应用程序中时找到dfm。
你们中的许多人现在可以这样说,我将无法再在组件设计时间中直观地编辑表单。是的,这是真的,但如果您考虑一下,为什么我要将表单经常更改为一个组件,在实践中,只应该使用和略微编辑?得出你自己的结论;)