Delphi 类引用作为属性
谷歌对这类搜索毫无用处,因为你会得到数亿条搜索结果,而这些结果都与具体问题无关 问题很简单:Delphi 类引用作为属性,delphi,oop,properties,reference,fpc,Delphi,Oop,Properties,Reference,Fpc,谷歌对这类搜索毫无用处,因为你会得到数亿条搜索结果,而这些结果都与具体问题无关 问题很简单: 在Delphi中是否可以有类引用属性 如果是,怎么做 这是我试过的 type TMyObject = class // ... end; TMyObjectClass = class of TMyObject TMyObjectA = class(TMyObject) // specifics here end; TMyObjectB =class(
- 在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
属性
我在这里的目标(如果您还没有猜到的话)是这样做,以便我可以从特定的基类中选择一个类的后代,使相同的组件以不同的方式运行
我希望这样做,这样组件就不需要直接了解子类(它需要完全模块化)
让我明确一点:我不能使用枚举在子类类型之间进行选择,因为组件不能直接链接到子类类型(在这种特殊情况下根本不可能)
无论如何。。。提前谢谢 您可以找到从特定基类派生的所有类:并使用
TPropertyEditor
将其作为具有值列表的特殊属性。如果要执行此操作,则需要提供。IDE没有为类类型属性提供属性编辑器。您还需要处理.dfm持久性。您可以将类类型作为字符串写入.dfm文件,并且在读取.dfm文件时,需要修复引用。新型RTTI可以做到这一点
然而,出于以下原因,我认为这一切实际上都不可行。设计时代码在IDE内的包中运行,并且无权访问IDE中活动项目中的类类型。这些类类型仅在项目运行时存在。因此,问题代码中的ObjectType
属性不能指定给设计时包中任何有意义的内容。嗯,您可以将它用于VCL中定义的类和IDE中安装的任何其他包,但我更愿意将它用于活动项目中定义的类
我认为所有这些都意味着您应该改用一个简单的字符串属性,并仅在运行时修复类类型引用。对象检查器不显示该属性,因为没有为其注册的属性编辑器。请将您的答案标记为第一个回答的正确答案(当然,这是正确答案)。我不会使用这种方法,因为我不想在这个系统中使用任何RTTI。决定采用“交叉连接组件”的想法(在代码< TMyObjuta或