TObject::MethodAddress - C++ Builder

C++ Builder 参考手册SystemTObjectMethodAddress


头文件:#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 参考手册SystemTObjectMethodAddress

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容