类引用作为属性

时间:2012-01-28 16:21:01

标签: delphi oop properties reference fpc

谷歌对这些类型的搜索毫无用处,因为你得到了数以亿计的结果,绝对没有一个与特定问题有关。

问题很简单:

  • 是否可以在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;

上面的代码编译得很好,但是Object Inspector根本没有显示ObjectType属性。

我的目标(如果您还没有猜到)是为了让我可以从特定基类中选择一个类后代,以使相同的组件以不同的方式运行。

我想这样做,以便组件不需要直接了解子类(它需要完全模块化)。

让我说清楚一点:我不能使用Enum在子类类型之间进行选择,因为组件不能直接链接到子类类型它根本就不是在这种特殊情况下可能

无论如何......提前谢谢!

2 个答案:

答案 0 :(得分:5)

您可以找到所有来自特定基类的类:Delphi: At runtime find classes that descend from a given base class?并使用TPropertyEditor将其设为包含值列表的特殊属性。

答案 1 :(得分:3)

如果您打算这样做,那么您需要提供property editor。 IDE没有为类类型属性提供属性编辑器。您还需要处理.dfm持久性。您可以将类型类型作为字符串写入.dfm文件,并且在读取.dfm文件时,您需要修复引用。新式RTTI可以做到这一点。

但是,由于以下原因,我认为其中任何一项都不可行。您的设计时代码在IDE内部的包中运行,并且无法访问IDE中活动项目中的类类型。这些类类型仅在该项目运行时存在。因此,问题代码中的ObjectType属性不能分配给设计时包中有意义的任何内容。好吧,你可以将它用于VCL中定义的类和IDE中安装的任何其他软件包,但我想你想在活动项目中定义的类上使用它。

我认为所有这些意味着您应该使用简单的字符串属性并仅在运行时修复类类型引用。