在一个类中,调用另一个类的成员函数,代码如下:
//定义事件函数指针,__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