Delphi,如何在两个不同的包中安装具有相同名称的组件
Posted
技术标签:
【中文标题】Delphi,如何在两个不同的包中安装具有相同名称的组件【英文标题】:Delphi, How to install a component with the same name in two different package 【发布时间】:2015-06-19 00:23:29 【问题描述】:我需要安装两个不同的组件包,第一个使用BDE连接,第二个使用FireDAC连接,它们都包含一个名为“TKsAnalExpr”的组件,它包含在一个名为“UAnalExpr”的单元中。
我正确安装了其中一个包,但是当我尝试安装第二个包时,Delphi 显示以下错误消息:
注册过程,包C:\Entorno Delphi XE3\BPL\Kactus.bpl中的Kactus@UAnalExpr.Register引发异常类EFilerError: 组件TKsAnalExpr不能被包kactus.bpl注册,因为它已经被包注册KactusOP.bpl
我使用命名空间更改了单元的名称,例如分别在 PkgeBDE.UAnalExpr
和 PkgeFireD.UAnalExpr
中。
但是当我再次尝试安装第二个包时,它显示了与上面相同的错误消息。
我正在使用 XE3 Upd 1 和 FireDAC 8.0.5。
PD:如果有人想知道,“AnalExpr”代表“Analizador de Expresiones”。呵呵。
【问题讨论】:
提示:不要,只是不要使用“Anal”代替 os Analise、Analisis 或类似的东西。 您重新设计您的类,使 TKsAnalExpr 有一个名为 Engine 的属性,当您将它放到表单上时,您将 Engine 属性连接到 TKsBdeEngine 或 TKsFireDACEngine。你有没有注意到,例如,有一个 TDataSource 类,以及可以连接到 TDataSource 的大量 TDataset?同样的想法。 【参考方案1】:简单地说,你不能有两个同名的注册组件。特定框架(VCL 或 FMX)内的组件只有一个命名空间。
考虑流式传输框架如何在 .dfm 文件中解决此类问题
object MyComponent1: TMyComponent
它知道它需要实例化TMyComponent
的实例。因此,它会在该类注册表中查找名称为 TMyComponent
的类。如果可以有两个同名的类,那么这种查找就没有意义了。
您必须确保注册组件的名称是唯一的。
【讨论】:
感谢您的回答我理解您的意思,但是在Delphi中这种配置有很多情况,例如:TButton组件,它包含在两个包中:dclfmxstd170.bpl和dclstd170.bpl谢谢 采取了特殊措施将组件从不同的框架中分离出来。我认为您无法使用该选项。在您的 .dfm 文件中,当流式处理框架遇到object Expr1: TKsAnalExpr
时,您希望实例化哪种类型?
@ErikFerneyCubillosGarcia:一个组件可以存在于多个包中,但这些包不能同时加载。 dclstd170.bpl
用于 VCL,dclfmxstd170.bpl
用于 FireMonkey。这两个框架不是设计用来一起使用的,它们各自的包也不会同时加载到IDE中。
@Remy 比这复杂一点。这两个包可以同时加载到 IDE 中。每个框架的命名空间都是隔离的。
@RemyLebeau 我认为GroupDescendentsWith
是该隔离机制的关键。也许吧!以上是关于Delphi,如何在两个不同的包中安装具有相同名称的组件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Google 的 Colab 中安装 Python 包?