【问题标题】:Delphi, How to install a component with the same name in two different packageDelphi,如何在两个不同的包中安装具有相同名称的组件
【发布时间】: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?同样的想法。

标签: delphi package components vcl bpl


【解决方案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 是该隔离机制的关键。也许吧!
猜你喜欢
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 2014-11-12
  • 1970-01-01
  • 2020-03-30
  • 2020-01-22
  • 1970-01-01
相关资源
最近更新 更多