组件构建 - 未找到用于 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...
我正在尝试构建一个新组件,我想创建一个 属性,我想在其中关联一个 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...