__closure调用另一个类中的函数

在一个类中,调用另一个类的成员函数,代码如下:

//定义事件函数指针,__closure相当于C#中的event
typedef void __fastcall(__closure * TMyEvent)(TObject *Sender ,AnsiString s);
//---------------------------------------------------------------------------
class a:public TObject
{
    private:
        TMyEvent FOnTextOut;//定义事件,本质是一个指针
    public :
        void __fastcall test(AnsiString s)
        {
            if(FOnTextOut)
            {//激活事件,同时可以提前做一些工作
               FOnTextOut(this,s);
            }
        }
    __property  TMyEvent OnHello = {read=FOnTextOut,write=FOnTextOut};
};

在窗口中,窗口本身是一个类,即在窗口类中调用类a,如下:

//在窗口的.h文件中,声明了OnTip函数,如下:
//void __fastcall OnTip(TObject * Sender, AnsiString str);
//窗口的.cpp文件中,实现OnTip
void __fastcall TForm1::OnTip(TObject * Sender, AnsiString str)
{//窗口成员函数
    ShowMessage("窗口成员函数:"+str);
}
//在此窗口中,有一个普通的按钮,进行测试
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   a * p = new  a;
   p->OnHello = OnTip;//绑定窗口成员函数OnTip到类a中事件指针
   //相当于激活接口
   p->test("hello");//类a中的成员函数test调用到了窗口成员函数,实际执行的是本窗口中的OnTip函数  
}

如果不加__closure编译通不过,显示错误:

[C++ Error] Unit1.h(28): E2235 Member function must be called or its address taken

说明:

(1)如果OnTip函数,不想带上TObject *Sender参数,则类a不必继承自TObject
(2)如果OnTip函数,不想带上TObject*Sender参数,则事件指针声明为:typedef void __fastcall(__closure * TMyEvent)(AnsiString s);
(3)如果类a继承自TObject时,须要用new创建对象
(4)TNotifyEvent是我们定义的TMyEvent的一个特例。即它的参数只有一个,且为TObject*Sender

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值