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

时间:2011-10-15 20:57:42

标签: delphi class components metaclass

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

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

我有另一个设计时组件,它是一个客户端组件。在设计时,我通过IDE的Property Editor使用Server的“client”属性将客户端组件的具体实例(放在同一Form上)分配给Server组件。但是,我还想通过“client”属性为FClientOlass分配给FClientObj的具体组件的基础类。这样服务器组件可以在运行时使用FClientClass.Create创建Client组件的新实例。

当我通过Server组件的属性设置器设置FClientObj数据成员时,我无法弄清楚如何将“client”对象的基础类分配给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变量的Metaclass。我只是不知道正确的语法来进行分配。我不想这样做:

FClientClass := TClient;

因为我希望将来允许分配具体组件,这些组件可能是TClient的后代。

正确执行赋值的语法是什么?我希望它比使用RTTI库做一些复杂的事情更简单,就像在这个帖子中 Malte的回复一样:

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

1 个答案:

答案 0 :(得分:7)

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

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

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

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