如何从 Delphi 6 对象中获取类以分配给元类变量?

Posted

技术标签:

【中文标题】如何从 Delphi 6 对象中获取类以分配给元类变量?【英文标题】:How to get the class from a Delphi 6 Object for assigning to a metaclass variable? 【发布时间】:2011-12-08 11:58:34 【问题描述】:

我有一个 Delphi 6 Metaclass 变量,它为设计时服务器组件的组件属性提供服务:

type
  TClientClass = class of TClient;
...
FClientClass: class of TClientClass;
FClientObj: TClient;

我有另一个设计时组件,它是客户端组件。在设计时,我通过 IDE 的属性编辑器使用服务器的“客户端”属性将客户端组件的一个具体实例分配给服务器组件,该实例拖放到同一个表单上。但是,我还想将 FClientClass 变量分配给我通过“client”属性分配给 FClientObj 的具体组件的基础类。这样服务器组件就可以在运行时使用 FClientClass.Create 创建客户端组件的新实例。

当我通过服务器组件的属性设置器设置 FClientObj 数据成员时,我无法弄清楚如何将“客户端”对象的底层类分配给 FClientClass 数据成员:

procedure setClientClass(theClient: TClient);
begin
    // Assign the "client" property.  This works.
    FClientObj := theClient;

    // Assign the class of the "client" object to the Metaclass variable.
    // THIS DOESN'T WORK: incompatible types error from the compiler.
    FClientClass := theClient;
end;

我很确定问题在于我试图将 TClient 的对象分配给 TClient 变量的元类。我只是不知道进行分配的正确语法。我不想这样做:

FClientClass := TClient;

因为我想允许将来分配可能是 TClient 后代的具体组件。

正确执行分配的语法是什么?我希望它比使用 RTTI 库做一些复杂的事情更简单,例如 Malte 的 在此线程中的回复表明:

How can I create an Delphi object from a class reference and ensure constructor execution?

【问题讨论】:

【参考方案1】:

我相信您正在寻找TObject.ClassType。像这样使用它:

procedure setClientClass(theClient: TClient);
begin
  FClientObj := theClient;
  FClientClass := TClientClass(theClient.ClassType);
end;

注意 1: 我假设您的意思是 FClientClass: TClientClass 而不是 FClientClass: class of TClientClass

注意 2:我只是在脑海中编译了这个;我希望它适用于真正的编译器。

【讨论】:

以上是关于如何从 Delphi 6 对象中获取类以分配给元类变量?的主要内容,如果未能解决你的问题,请参考以下文章

为 Python 3.6 元类提供 __classcell__ 示例

在 Delphi 7 中获取对象的分配地址

尝试在 Python 2.7 中将 SQL*Plus 输出分配给元组(二维数组)

如何使用在设计时获取“无法将 NIL 分配给 TFont”的 TFont 属性修复 Delphi 组件?

如何获取 Delphi 程序使用的内存

Delphi 泛型约束问题