组件构建 - 未找到用于 TFDConnection 的必需包

Component Build - Required package used for TFDConnection not found

我正在尝试构建一个新组件,我想创建一个 属性,我想在其中关联一个 TFDConnection 对象,如下所示:

uses
  System.SysUtils, System.Classes, System.Types, System.UITypes,
  Vcl.Dialogs, Vcl.Graphics,
  ColnEdit, DesignIntf, DesignEditors,
  VirtualTrees, FireDac;

type
  TMyComp = class(TComponent)
  private
    FFDConnection: TFDConnection;
    procedure SetFDConnection(Value: FFDConnection);
  protected
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property FDConnection: TFDConnection read FFDConnection write SetFDConnection;
  end;

我的问题是找不到组件包中使用的 FireDac 包。

package MyPackage;

...

requires
  rtl,
  vcl,
  VirtualTreesR,
  DesignIde,
  dclFireDAC230; //<--- this package it's not recognized

contains
  MyComp in 'MyComp.pas';

end.

[dcc32 Fatal Error] MyPackage.dpk(36): E2202 Required package 'dclFireDAC230' not found

我从这里取这个名字:

如何识别TFDConnection对应的所需包名?

确实如此。 dclFireDAC - 是一个 "design-time" 包,它没有组件,它只向 IDE 宣传它。你需要用它找到一个 "runtime" 包。

实际上有很多方法可以或多或少地找到它。

我没有 XE3,所以我不知道 - 里面有 FireDAC 源吗? 你能在 Delphi 来源的文件夹中找到 FireDAC 的 *.dpk 吗? c:\Program Files (x86)\Embarcadero\Studio.0\Sources.

哪个单元声明了那个组件,"FireDac"? 您可以查看有关 TFDConnection 类型的帮助,或者您可以 CTRL+单击 TFDConnection 类型输入您的源代码以打开声明单元。对于其余的评论,我假设单位是 "FireDAC".

查看该文件夹,找到所有包含 "FireDac" 作为单独(完整)单词的 FireDAC *.dpk(任何文件管理器都可以进行简单的文本搜索)。如果 .dpk 源的 contains 部分中有 "FireDAC" 单元 - 那就是您需要的 dpk/bpl。这是一个用 SQLExpr 单位搜索包的例子(因为我的 Delphi 里面没有 Any-DAC)。


另一种方法 - 由于 BPL 是 DLL 的特例,您可以搜索它的导入并找到它从哪里借用您的组件。您需要像 Microsoft Dependency Walker 这样的工具或类似的工具来分析 DLL (BPL) 关系。由于我在 Delphi XE2 中没有 AnyDAC,我会显示对 TDataSet 的类似搜索 - 我们会在 dclDB160.bpl 设计时(广告)包中找到它,那么我们在哪里可以找到它的运行时(实现)包?

示例一:ntCore CFF 资源管理器套件。 我们打开设计时 BPL,搜索它导入了哪些运行时 BPL,并在看起来相关的 BPL 中查找我们的 class。实际上我们找到了 class 和它声明的单位。

这个工具很强大,但是是低级的,它显示了每个 BPL 的许多单独的导入记录。有没有更省电但更容易使用的东西?

示例 2:Unreal Commander(或商业 Total Commander)和 FileInfo 插件。

虽然还有很多BPL,但不再重复。我们寻找一级 BPL 并猜测最佳匹配 - DBRTL160.BPL 它有我们需要和搜索的 class 吗?

我们转到 "Imports" 选项卡,然后从列表中 select 我们的候选人 "DBRTL160"。 然后我们向下滚动下方窗格,从底部搜索我们组件的 Virtual Methods Table

我们再次找到了组件实现、声明它的单元以及包含该单元的运行时包。

任何其他 DLL 交叉依赖查看器都会执行相同的操作。自从您开始开发和使用包以来,您无论如何都必须将其中一些添加到您的工具箱中。当您要优化文件大小时排除不需要的文件,或确定不同但相互关联的 Delphi 项目的构建顺序 - 您无论如何都需要其中一个查看器。


另一种方法:它并不总是有效,但它可能是最懒惰的方法。

制作一个新的简单的单格式 EXE 项目。进入项目属性并转动一个 "Build with runtime packages" 开关。

编译它并返回到那些属性 - 您会在那里看到您的 EXE 需要的运行时包列表。复制到记事本中。

现在将有问题的组件 ( 'TFDConection' ) 放在表单上并再次编译您的 EXE。进入项目属性并复制新的、更新的运行时包列表。

将它作为第二行粘贴到记事本中并比较这两行,新的和旧的,以查看在删除组件后添加了哪些包。其中之一就是您所需要的。

使用FireDAC230,即运行-时间包。

受到答案的启发,我发现代替 FireDac 我应该在我的组件 FireDAC.Comp.Client 的代码中使用,如下所示:

uses
  System.SysUtils, System.Classes, System.Types, System.UITypes,
  Vcl.Dialogs, Vcl.Graphics,
  ColnEdit, DesignIntf, DesignEditors,
  VirtualTrees, FireDAC.Comp.Client;

事实上,在标准应用程序中,当您拖放表单 TFDConnection 时,Delphi 会自动添加到 uses 所有这些波纹管模块:

uses
  ...
  FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
  FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.VCLUI.Wait,
  Data.DB, FireDAC.Comp.Client

在link之后我们可以看到在FireDAC.Comp.Client.

里面定义了TFDConnection

现在,通过将 FireDAC.Comp.Client 添加到我的组件,当我尝试构建我的组件时,Delphi 通过建议我将什么添加到 require 部分来做一件聪明的事情包裹。

点击确定后,Delphi会自动把代码改成这样:

requires
  rtl,
  vcl,
  VirtualTreesR,
  DesignIde,
  dbrtl,
  FireDAC,
  FireDACCommonDriver,
  FireDACCommon;

.dcu 文件似乎位于: C:\Program Files (x86)\Embarcadero\Studio.0\lib...