【问题标题】:Class Reference as Property类引用作为属性
【发布时间】:2012-02-21 05:42:56
【问题描述】:

Google 对这类搜索毫无用处,因为您会获得数亿条结果,其中没有一个与特定问题相关。

问题很简单:

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

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

【问题讨论】:

  • 对象检查器不显示该属性,因为它没有注册的属性编辑器。

标签: delphi oop properties reference fpc


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 将您的答案标记为与您第一次回答时一样正确(当然,这是正确的答案)。我不会使用这种方法,因为我不想在这个系统中使用任何 RTTI。决定采用“交叉链接组件”的想法(其中TMyObjectATMyObjectB 的组件通过属性链接到TMyComponent 实例。这样更容易!
    • Simon,考虑一下这样的属性编辑器如何在设计时包的上下文中实际获取类类型。
    • 大卫,是的......添加一个属性编辑器来处理这类事情会相对容易(使用 RTTI)......但正如我在之前的评论中所说,我没有想要在编译的可执行文件中使用 RTTI(我必须这样做才能从 DFM 中存储的限定名称中获取类)
    • @LaKraven 不,这并不容易。您必须解析当前加载到 IDE 中的项目的源代码!请记住,类类型直到运行时才真正存在,但您的 IDE 包在设计时运行。
    • 为了澄清上述内容......事实证明我完全错了,@DavidHeffernan 是正确的! RTTI 不能在设计时用于内省活动项目中定义的类型。它只能对包中注册的类型执行此操作!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2016-12-02
    • 2018-02-26
    相关资源
    最近更新 更多