C++ Builder 参考手册 ➙ System ➙ TObject ➙ MethodAddress
头文件:#include <systobj.h>
命名空间: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<TControl *>(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