TObject::MethodAddress - C++ Builder

C++ Builder 参考手册 ➙ System ➙ TObject ➙ MethodAddress


头文件:#include
命名空间:System
函数原型:

__classmethod void *__fastcall MethodAddress(const ShortString &Name);
__classmethod void *__fastcall MethodAddress(const UnicodeString Name);

System::TObject::MethodAddress 是 System::TObject 的成员函数,通过名称返方法的地址。

参数:
Name:方法的名称,即成员函数的名称。

返回值:
方法的地址,即成员函数的地址,只有在 __published: 访问权限里面的函数支持通过名称返回地址。如果这个方法不在 __published: 访问权限区域里面,返回值为 NULL;如果没有这个名称的方法,返回值为 NULL。

需要通过 TMethod 对象转为 __closure 指针来调用成员函数,__closure 指针要定义为和成员函数相同的类型,例如参数,返回值等都必须相同,调用才不会出错。


例:通过 "Button1Click" 这个字符串找到 this->Button1Click 的地址,并且调用这个函数。

由于 Button1Click 这个函数是 Button1 的点击事件,在窗口设计时自动生成的,是 Form1 的 __published: 成员,所以可以使用 MethodAddress 方法得到函数地址。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TControl *lpControl = dynamic_cast(Sender);
    if(lpControl)
    {
        ShowMessage(L"Button1 按钮点击事件,Sender = " + lpControl->Name);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TMethod Method; // = this->Button1Click;
    Method.Code = this->MethodAddress(L"Button1Click");
    Method.Data = this;

    typedef void __fastcall (__closure *TFunc)(TObject *);
    TFunc lpFunc = *(TFunc*)&Method;
    lpFunc(this); // this->Button1Click(this);
}

运行结果:

  • 点击 Button1,执行 Button1 的点击事件,可以看到 Sender = Button1,这是正常执行事件函数;
  • 点击 Button2,通过 "Button1Click" 字符串找到了这个函数的地址,并且调用这个函数时,参数用了 this,即 Form1,可以看到执行结果为 Sender = Form1。
点击 Button1 的运行结果
点击 Button2 的运行结果

参考:

  • C++ Builder 的 PME 架构
  • C++ Builder 枚举控件所有的属性、事件和方法
  • System::TObject::MethodName
  • System::TObject::FieldAddress
  • System::TObject::ClassInfo
  • System::TObject::ClassType
  • System::TObject
  • VCL 类继承关系

C++ Builder 参考手册 ➙ System ➙ TObject ➙ MethodAddress

你可能感兴趣的:(TObject::MethodAddress - C++ Builder)