但是,我开始不明白如何使文件可用,以便我可以使用包或预编译的 DCU(就像第三方供应商一样)进行编译,而无需始终将项目指向源代码。我可以使用以下设置创建包:
![enter image description here](https://istack.dev59.com/yicSX.webp)
谢谢。
像其他人所说的一样,您可以使用post-build事件将DFM文件复制到指定位置。其他人使用一次性的外部批处理文件将DFMs复制到DCU文件夹。
个人认为,对于那些不作为可重用组件开发的事物来说,制作包的好处非常少。当您不需要合理地多次使用相同的子段或包时,将现有应用程序划分为包也几乎没有好处。
我会把以下内容放入包中:
Delphi可视和非可视组件。
必须在运行时插入或留下的内容。例如,假设我销售MetaWare Light和MetaWare Pro,并且我希望出于某种原因不使用编译器IFDEFs来构建不同的二进制文件,则可以选择不与系统一起发布ADVANCEDFEATURE.BPL。
创建包时需要注意的事项:
当将泛型与包结合使用时,我遇到了许多编译器错误。我还在Delphi 2009、2010、XE和XE2中遇到了IDE崩溃和锁定问题。(我认为XE3更好)
在移向BPL领域之前,您应该了解一些关于BorlandMM.dll和共享内存管理的微妙之处。
包限制了链接器决定什么要删除的能力。事实上,它几乎摧毁了它。包含所有链接到其中的内容,且无法公开访问任何可移除的内容。
一旦您创建了一个二进制包并将其发送给至少一位客户,您就会拥有一个非常难以修改的合约(此BPL包含特定的签名或应用程序二进制接口),您必须小心未来永远不要更改它们或混合使用它们。即使是在您自己的客户中也要注意DLL地狱,并准备对您的包使用版本控制。正如Delphi包具有版本后缀一样,我建议您从一开始就在自己的包中使用版本后缀,并在二进制兼容性已更改时递增它们。
Delphi处理包之间的构建依赖关系的能力与单个整体应用程序相比要好得多。对于那些大量使用包的应用程序,我发现包含互相依赖的一堆包的项目组非常难以管理和快速构建。事实上,我经历过编译和构建都比一个750K行的超级项目慢且更加令人沮丧。
我真的很怀疑您是否真的对Delphi的包区域(每当Delphi组件实际上可以无问题地构建和安装时,您是否松了一口气?)非常感兴趣,如果您真的想完全进入包的世界,我建议您先学习更多。毫无疑问,您应该进行一些实验。但我不会把全部赌注都押在此上。
是的,如果您只想在搜索路径中使用一个目录,那么应将.dfm复制到已编译单元(.dcus)的目录中。BPL当然包含.dfms,您需要一个.dcp才能将BPL与您的应用程序链接。
第三方工具必须使用其安装程序将.dfms和.dcus放在同一目录中。
您可以使用后期构建事件(项目/选项/构建事件)来代替手动复制*.DFM文件,例如:
copy “$(PROJECTDIR)\Unit1.DFM” “c:\Scratch\wow\Unit1.DFM”
我找到了一种方法,可以在不将 .dfm 文件移动到 .dcu 文件目录的情况下实现这一点,因此您可以为 .dcu 文件、.dcp 文件和 .bpl 文件分别设置目录。
您需要做的就是像我一样,在您的良好结构中创建另一个目录。该目录名为 RES,其中应放置所有资源文件(.res 文件,而不是 .dcr 文件),这些资源文件由使用您的包(组件)编译的应用程序使用。在 Delphi 库路径中,除了 DCU 目录(您应该已经有了)之外,还必须包括名为 RES 的目录。
在您的组件(设计时)中,您可以随意对表单进行操作(设计它,放置其他组件等)。在该单元的源代码中,您将 {$R *.dfm} 替换为 {$R UnitName.dfm}。这样做后,保存所有更改并关闭 DPK。现在将 .dfm 文件移动到 RES 文件夹中(不要复制,移动!),因为 .dfm 文件是 Delphi 的资源文件({$R} 指令是证明!),然后再次打开 DPK 以了解发生了什么变化。
首先请注意,您可能无法从其单元中打开表单(F12),尽管 Delphi 没有发出“DFM 缺失”的错误。
现在,在您的包上进行构建,然后安装它。又意识到了吗?没有显示错误!这是因为您已经在Delphi库搜索路径(RES目录)中指定了.dfm文件的位置。
完成!您可以使用您的组件,并且当您的组件被包含在应用程序中时,dfm将被找到。
你们中的许多人现在可能会说,这样我将无法在组件设计时间内进行可视化表单编辑。是的,这是真的,但是如果您考虑一下,为什么我要经常将一个表单更改为组件,而实际上只应该使用和轻微编辑组件呢?得出自己的结论吧 ;)