原贴:
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;------------------------------------------------------
根据老大的提示,我搞定了,谢谢啦!!!