8

在使用这些包编译我的应用程序之前,我正在尝试将我自己的库作为包提供,从而模块化我的代码。多年来,我“有点”理解软件包,当我加载一个组件包并单击“安装”时,我松了一口气。我了解安装一个(或多个)组件的过程是通过创建 BPL,然后在 IDE 中注册。

我开始迷失的地方是如何使文件可用,以便我可以使用包或预编译的 dcu 进行编译(就像第三方供应商所做的那样),而无需一直将我的项目指向源代码。我可以使用以下设置创建一个包:

在此处输入图像描述

我已经指定我的所有输出都将进入'c:\scratch\wow'。在构建之后,我找到了 TEST.BPL、TEST.DCP 和许多 DUC。现在,当我在此文件夹中指向另一个项目以使用 DCU 时,我收到了一个丢失的 DFM 错误(其中一个单元是表单)。我应该手动将所需的 DFM 复制到此输出文件夹中吗?DPK 知道这个表格,那么为什么我没有为我复制 DFM?我假设使用 TEST.BPL,该文件包含所有内容,但我希望在这两种模式下工作。当然,我可以通过在我的项目搜索路径中包含源文件夹来查找 DFM 来解决这个问题,但第三方库似乎已经在其输出文件夹中包含了 DFM。他们是否使用安装程序将它们安装在那里?谢谢

反而

4

4 回答 4

10

正如其他人所说,您可以使用构建后事件将 DFM 文件复制到位。其他人使用将 DFM 复制到 DCU 文件夹的一次性外部批处理文件。

就我个人而言,我认为为不作为可重用组件开发的东西制作包几乎没有什么好处。当您合理地不需要多次使用相同的小节或包时,或者在设计时,我也看到将现有应用程序划分为包的好处很少。

我会放入包中的东西:

  1. Delphi 可视化和非可视化组件。

  2. 绝对必须在运行时插入或忽略的东西。例如,假设我销售 MetaWare Light 和 MetaWare Pro,而不是使用编译器 IFDEF 来构建不同的二进制文件,出于某种原因,我宁愿不随我的系统一起提供 ADVANCEDFEATURE.BPL。

使用包需要注意的事项:

  1. 在将包与泛型结合时,我遇到了很多编译器错误。在 Delphi 2009、2010、XE 和 XE2 中,我也遇到过 IDE 崩溃和锁定。(我相信XE3更好)

  2. 在开始学习之前,您应该了解一下 BorlandMM.dll 和 BPL 世界中的共享内存管理。有一些微妙之处。

  3. 包限制了链接器决定删除什么的能力。事实上,它几乎摧毁了它。包包含链接到它们的所有内容,并且无法删除任何可公开访问的内容。

  4. 一旦您创建了一个二进制包并将其发送给一个客户,您就很难修改合同(此 BPL 包含特定的签名或应用程序二进制接口),您必须小心以后不要更改它们,或者混合和匹配它们。提防 DLL 地狱,即使是在您自己的客户中,并准备在您的包上使用版本控制。就像 delphi 软件包有版本后缀一样,我建议您立即在自己的软件包中使用版本后缀,并在二进制兼容性发生变化时使用它们。

  5. Delphi 处理包之间的构建依赖关系与预期的一样好,这不如单个单体应用程序好。在我大量使用包的应用程序中,我发现包含一堆相互依赖的包的项目组很难管理和快速构建。事实上,我经历过编译和构建都比单一的 750Kline 大型项目更慢、更令人沮丧。

我真的想知道如果你真的想完全进入 Packages World,你是否还没有进入 Delphi 的包领域(每当一个 delphi 组件实际构建和安装没有问题时,你都会松一口气?)。无论如何,你应该尝试一下。但我还不会赌农场。先多了解一些。

于 2011-07-24T18:44:31.743 回答
5

是的,您应该将 .dfm 复制到包含已编译单元 (.dcus) 的目录中,如果这是您在搜索路径中想要的唯一目录。BPL 当然会包含 .dfms,并且您需要一个 .dcp 才能将 BPL 与您的应用程序链接。

确实,第三方工具必须使用其安装程序将 .dfms 与 .dcus 放在目录中。

于 2011-07-24T17:58:55.503 回答
2

您可以使用构建后事件(项目/选项/构建事件),而不是手动复制 *.DFM,例如:

copy “$(PROJECTDIR)\Unit1.DFM” “c:\Scratch\wow\Unit1.DFM”
于 2011-07-24T18:00:49.327 回答
0

我找到了一种无需将 .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。

你们中的许多人现在可以说,这样我将不再能够在组件设计时直观地编辑表单。是的,这是真的,但如果你仔细想想,我为什么要经常将一个表单更改为一个在实践中只应该使用和稍微编辑的组件?得出你自己的结论;)

于 2011-07-26T02:06:02.390 回答