我正在尝试构建一个新组件,我想创建一个属性,我希望将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对应的所需包的名称?
答案 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
部分的内容来做一件聪明的事。
单击确定后,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)。
另一种方法 - 由于BPL是DLL的特例,您可以搜索其导入并找到它从中借用组件的位置。您需要一个工具,如Microsoft Dependency Walker
或类似的工具来分析DLL(BPL)关系。由于我在Delphi XE2中没有AnyDAC,我会显示TDataSet
的类似搜索 - 我们会在dclDB160.bpl
设计时(广告)包中找到它,那么我们在哪里可以找到运行时(实现)包装吗?
示例一:ntCore CFF Explorer套件。 我们打开设计时BPL,搜索它导入的运行时BPL,并在看似相关的BPL中查找我们的类。实际上,我们发现它所声明的类和单位。
这个工具很强大,但是很低级,它为每个BPL显示了许多单独的导入记录。是否有更少的功能但更容易使用?
示例2:Unreal Commander(或商业Total Commander)和FileInfo插件。
虽然仍然有很多BPL,但它们并没有重复。我们寻找一级BPL并猜测最佳匹配 - DBRTL160.BPL 它是否有我们需要的类并搜索?
我们去&#34; Imports&#34;选项卡并选择我们的候选人&#34; DBRTL160&#34;从列表中。 然后我们向下滚动下方窗格,从底部开始搜索我们的组件虚拟方法表
同样,我们找到了组件实现,以及声明它的单元,以及包含该单元的运行时包。
任何其他DLL交叉依赖性查看器都会这样做。而且,由于您开始开发和使用软件包,您无论如何都必须将其中的一些添加到工具箱中。当您优化文件大小(不包括不需要的文件)或确定不同但相互关联的Delphi项目的构建顺序时 - 无论如何您都需要其中一个查看器。
另一种方法:它并不总是有效,但它可能是最懒惰的。
制作一个新的简单单一形式的EXE项目。进入项目属性并打开一个&#34; Build with runtime packages&#34;开关。
编译它并返回到这些属性 - 您将看到EXE需要的运行时包列表。将其复制到记事本中。
现在将您的组件放在表单上(&#39; TFDConection&#39;),然后再次编译您的EXE。进入项目属性并复制新的,更新的运行时包列表。
将其作为第二行粘贴到记事本中,并比较这两行(新旧行),以查看删除组件后添加的包。其中一个就是你需要的。
答案 2 :(得分:0)
使用FireDAC230,这是一个运行时包。