谢谢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;

------------------------------------------------------
根据老大的提示,我搞定了,谢谢啦!!!
...全文
269 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
耙子 2007-01-03
  • 打赏
  • 举报
回复
伴水现在蹦跶的还这么欢实,哈哈!
chanbzou 2007-01-03
  • 打赏
  • 举报
回复
路过!
dBASEIII 2007-01-03
  • 打赏
  • 举报
回复
伴水最近忙,让我代领。
qiume 2007-01-03
  • 打赏
  • 举报
回复
老大还没起床......
wudi_1982 2007-01-03
  • 打赏
  • 举报
回复
替伴水领分..(有证)


王集鹄 2007-01-03
  • 打赏
  • 举报
回复
严禁无证领分
bluejingling 2007-01-02
  • 打赏
  • 举报
回复
恭喜楼主!
我也来沾光了

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧