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

时间:2016-04-01 11:37:12

标签: delphi components firedac

我正在尝试构建一个新组件,我想创建一个属性,我希望将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

我从这里取名字: enter image description here

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

3 个答案:

答案 0 :(得分:1)

受到答案的启发,我发现代替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

点击链接后,我们可以看到TFDConnection内定义了FireDAC.Comp.Client

现在,通过向我的组件添加FireDAC.Comp.Client,当我尝试构建我的组件时,Delphi通过建议我从包中添加到require部分的内容来做一件聪明的事。

enter image description here

单击确定后,Delphi会自动将代码更改为:

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

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

答案 1 :(得分:0)

事实上。 dclFireDAC - 是设计时间&#34;包,它没有组件,它只将它通告给IDE。你需要找到一个&#34;运行时&#34;用它打包。

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

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

什么单位声明该组件,&#34; FireDac&#34; ? 您可以在TFDConnection类型上查看帮助,也可以在信息来源中按CTRL +点击TFDConnection输入以打开申报单位。对于评论的其余部分,我认为该单位是&#34; FireDAC&#34;。

查看该文件夹,找到所有具有&#34; FireDac&#34;的FireDAC * .dpk作为一个单独的(整个)单词(任何文件管理器都可以进行简单的文本搜索)。如果有&#34; FireDAC&#34; .dpk源代码的contains部分中的单位 - 这是您需要的dpk / bpl。以下是使用SQLExpr单位搜索包的示例(因为我的Delphi中没有Any-DAC)。

Example for search for a given word in files with a given mask

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

示例一:ntCore CFF Explorer套件。 我们打开设计时BPL,搜索它导入的运行时BPL,并在看似相关的BPL中查找我们的类。实际上,我们发现它所声明的类和单位。 ntCore.com

这个工具很强大,但是很低级,它为每个BPL显示了许多单独的导入记录。是否有更少的功能但更容易使用?

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

虽然仍然有很多BPL,但它们并没有重复。我们寻找一级BPL并猜测最佳匹配 - DBRTL160.BPL 它是否有我们需要的类并搜索?

我们去&#34; Imports&#34;选项卡并选择我们的候选人&#34; DBRTL160&#34;从列表中。 然后我们向下滚动下方窗格,从底部开始搜索我们的组件虚拟方法表 FileInfo.WLX virtual methods

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

任何其他DLL交叉依赖性查看器都会这样做。而且,由于您开始开发和使用软件包,您无论如何都必须将其中的一些添加到工具箱中。当您优化文件大小(不包括不需要的文件)或确定不同但相互关联的Delphi项目的构建顺序时 - 无论如何您都需要其中一个查看器。

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

制作一个新的简单单一形式的EXE项目。进入项目属性并打开一个&#34; Build with runtime packages&#34;开关。

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

现在将您的组件放在表单上(&#39; TFDConection&#39;),然后再次编译您的EXE。进入项目属性并复制新的,更新的运行时包列表。

将其作为第二行粘贴到记事本中,并比较这两行(新旧行),以查看删除组件后添加的包。其中一个就是你需要的。

答案 2 :(得分:0)

使用FireDAC230,这是一个运行时包。