谷歌对这些类型的搜索毫无用处,因为你得到了数以亿计的结果,绝对没有一个与特定问题有关。
问题很简单:
这是我尝试过的......
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在子类类型之间进行选择,因为组件不能直接链接到子类类型(它根本就不是在这种特殊情况下可能)
无论如何......提前谢谢!
答案 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中安装的任何其他软件包,但我想你想在活动项目中定义的类上使用它。
我认为所有这些意味着您应该使用简单的字符串属性并仅在运行时修复类类型引用。