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.UAnalExprPkgeFireD.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,如何在两个不同的包中安装具有相同名称的组件的主要内容,如果未能解决你的问题,请参考以下文章

你如何找到一个 Delphi 组件来自的包?

如何在 Google 的 Colab 中安装 Python 包?

如何在 Delphi 2010 ( UniSynEdit Package ) 中安装 Delphi 2009 组件包?

bcb6 中安装 delphi7 的控件包

如何从具有相同名称的两个接口实现两个方法?

如何使用 django 在 mysql 中的两个不同模式中使用两个具有相同名称的表