如何从 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__ 示例
尝试在 Python 2.7 中将 SQL*Plus 输出分配给元组(二维数组)