谢谢zswang(伴水清清)(专家门诊清洁工),请领分!!!
qiume 2007-01-02 04:18:47 原贴:
http://community.csdn.net/Expert/topic/5261/5261641.xml
原贴内容:
qiume(好好回贴,天天胖胖) ( ) 信誉:100 Blog 2007-01-02 08:37:30 得分: 0
再顶,随便问老大一个问题:
从TObject继承的类,有多个不同名但参数都相同的类方法,比如:
type
TMyClass = class(TObject)
public
class procedure MethodA(a:OleVariant;out b: OleVariant);//方法A
class procedure MethodB(a:OleVariant;out b: OleVariant);//方法B
end;
-----------------------------------------------------------------------
我现在有个字符串('TMyClass.MethodA'),怎样根据这个字符串实际调用一个类方法,
麻烦老大了,解决了我另开贴给200分,谢谢!!!
解答:
zswang(伴水清清)(专家门诊清洁工) ( ) 信誉:105 Blog 2007-01-02 11:33:28 得分: 0
to qiume:
你说的要求需要通过RTTI(运行期类型信息)来实现
编译器一般不会将类的方法名、字段名编译到程序中
[通过方法名确定方法地址]
除非将方法声明到published中
type
TMyClass = class(TObject)
published // <<<change
class procedure MethodA(a:OleVariant;out b: OleVariant);//方法A
class procedure MethodB(a:OleVariant;out b: OleVariant);//方法B
end;
或者使用TypeInfo编译条件
{$M+}
TMyClass = class(TObject)
class procedure MethodA(a:OleVariant;out b: OleVariant);//方法A
class procedure MethodB(a:OleVariant;out b: OleVariant);//方法B
end;
{$M-}
这样这些方法就会编译到目标程序中
通过类虚表可以访问
vmtFieldTable = -56;
vmtMethodTable = -52;
TMyClass.MethodAddress('MethodA')
TMyClass.MethodAddress('MethodB')
[通过类名确定类地址]
在Classes单元提供了FindClass()和GetClass()通过类名确定类地址的函数
它们的返回值为TPersistentClass(持久化类)
调用前还得使用RegisterClass()将需要处理的类注册到类列表中
参考代码:
type
{$M+}
TMyClass = class(TPersistent)
class procedure MethodA;//方法A
class procedure MethodB;//方法B
end;
{$M-}
//...
class procedure TMyClass.MethodA;
begin
ShowMessage('MethodA');
end;
class procedure TMyClass.MethodB;
begin
ShowMessage('MethodB');
end;
procedure TForm1.Button1Click(Sender: TObject);
type
TClassMethod = procedure of object;
var
vClass: TPersistentClass;
vMethod: TMethod;
begin
RegisterClass(TMyClass);
vClass := FindClass('TMyClass');
if Assigned(vClass) then
begin
vMethod.Code := vClass.MethodAddress('MethodA');
vMethod.Data := vClass;
TClassMethod(vMethod)();
vMethod.Code := vClass.MethodAddress('MethodB');
vMethod.Data := vClass;
TClassMethod(vMethod)();
end;
UnregisterClass(TPersistentClass(TMyClass));
end;
------------------------------------------------------
根据老大的提示,我搞定了,谢谢啦!!!