Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 类引用作为属性_Delphi_Oop_Properties_Reference_Fpc - Fatal编程技术网

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或 TMyObjutbB<代码>的组件中,通过属性链接到<代码> TMyTeals实例。更简单地说,西蒙,考虑这样的属性编辑器如何在设计时包中获得类类型。戴维,是的……这会比较容易(使用RTTI)。添加一个属性编辑器来处理这类事情……但正如我在前面的评论中所说的,我不想在编译的可执行文件中使用RTTI(我必须这样做才能从存储在DFM中的限定名获取类)@LaKraven不,这并不容易。您必须解析当前加载到IDE中的项目的源代码!记住,类类型在运行时才实际存在,但IDE包在设计时运行。为了澄清上述问题……结果证明我完全错了,@DavidHeffernan是正确的!RTTI不能用于设计n—在活动项目中定义的内省类型的时间。它只能对在包中注册的类型执行此操作!