7

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

问题很简单:

  • 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 在子类类型之间进行选择,因为组件不能直接链接到子类类型在这种特殊情况下根本不可能

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

4

2 回答 2

5

您可以找到从特定基类派生的所有类:Delphi:在运行时查找从给定基类派生的类?并使其成为具有值列表的特殊属性,使用TPropertyEditor.

于 2012-01-28T16:32:58.903 回答
3

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

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

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

于 2012-01-28T16:34:45.903 回答