我有一个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?
答案 0 :(得分:7)
我相信你正在寻找TObject.ClassType
。像这样使用它:
procedure setClientClass(theClient: TClient);
begin
FClientObj := theClient;
FClientClass := TClientClass(theClient.ClassType);
end;
注1:我假设您的意思是FClientClass: TClientClass
而不是FClientClass: class of TClientClass
。
注2:我只是在脑海中编写了这个;我希望它适用于真正的编译器。