类引用作为属性

7

对于这些类型的搜索,Google 没有用处,因为你会得到数亿个结果,绝对没有一个与具体问题相关。

问题很简单:

  • 在 Delphi 中是否可能拥有类引用属性?
  • 如果可以,如何实现?

以下是我尝试过的内容...

type

  TMyObject = class
    // ...
  end;

  TMyObjectClass = class of TMyObject

  TMyObjectA = class(TMyObject)
    // specifics here
  end;

  TMyObjectB  =class(TMyObject)
    // specifics here
  end;

  TMyComponent = class(TComponent)
  private
    FObjectType: TMyObjectClass;
  published
    property ObjectType: TMyObjectClass read FObjectType write FObjectType;
  end;

以上代码可以编译通过,但对象视图根本不显示ObjectType属性。
我的目标是让我能够选择特定基类的派生类,以使相同组件以不同方式运作。
我希望这样做的原因是组件不需要直接了解子类(它需要完全模块化)。
让我再次明确一点:我不能使用枚举来选择子类类型,因为组件不能直接链接到子类类型(在这种特定情况下根本不可能)。
无论如何,提前感谢您!

对象检查器未显示该属性,因为没有为其注册属性编辑器。 - kludg
2个回答

5

Simon,请考虑在设计时包的上下文中,这样的属性编辑器实际上如何获取类类型。 - David Heffernan
David,是的...使用 RTTI 添加一个属性编辑器来处理这种事情相对容易...但正如我在之前的注释中所说,我不想在编译后的可执行文件中使用 RTTI(为了从 DFM 中存储的限定名称获取该类), - LaKraven
@LaKraven 好的,但我认为您实际上想引用未安装到IDE中的类。如果您的VCL应用程序中定义了Unit1.pas中的类,那么怎么办?您只想引用VCL类吗? - David Heffernan
David,这个也可以!将任何项目加载到IDE中,RTTI可以在设计时查看其中定义的所有类型。这实际上就是我Lua4Delphi包装器单元生成器的工作原理...所以我已经在利用这种能力了! - LaKraven
4
为澄清上述内容...事实证明我完全错了,@DavidHeffernan是正确的!在设计时,RTTI不能用于内省活动项目中定义的类型,它只能用于已在包中注册的类型! - LaKraven
显示剩余7条评论

3
如果您想这样做,那么您需要提供一个属性编辑器。IDE没有为类类型属性提供属性编辑器。您还需要处理.dfm持久性。您将类类型写成字符串并将其写入.dfm文件,当读取.dfm文件时,您需要修复引用。新的RTTI风格可以做到这一点。
然而,我认为这些都不可行的原因如下。设计时代码在IDE内部的软件包中运行,并且无法访问IDE中活动项目中的类类型。这些类类型仅在该项目运行时存在。因此,您问题中代码中的ObjectType属性无法在设计时包中分配任何有意义的内容。嗯,您可以将其用于VCL中定义的类和安装在IDE中的任何其他软件包中的类,但我想您可能希望将其用于在活动项目中定义的类。
我认为所有这些意味着您应该改用简单的字符串属性,并仅在运行时修复类类型引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接