两种不同的事件调用方式:
class myTest :public TObject
{
private:
TNotifyEvent Ftime;//事件指针1,类似C#中的委托,固定格式
protected:
void __declspec(dynamic) DoEvent();//关联事件
public:
myTest(){}
void __fastcall ( __closure * ptest)(TObject * Sender);//事件指针2,可以定多个参数
__published:
__property TNotifyEvent OnTime={read=Ftime,write=Ftime};//声明成属性器,方便管理调用
};
void myTest::DoEvent()//通过成员方法过渡一下
{
if(Ftime)
{
Ftime(this);
}
}
调用方法如下:
myTest * p;
p = new myTest;
p->OnTime = Button4Click;//事件绑定动作(调用方式之一)
p->ptest = Form1->Button4Click;//函数绑定指针(调用方式之二)
void __fastcall TForm1::Button4Click(TObject *Sender)//事件的真正动作
{
ShowMessage("ok");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)//通过另外一个事件来调用我们定义的事件
{
p->OnTime(Sender);//定义的事件
p->ptest(Sender); //定义的指针2,相同的效果
}
TNotifyEvent的本质是定义一个函数指针,相当于用一个类的成员函数指针调用另一个类的成员函数。关键是使用__closure关键字,否则不能绑定。
编译通不过。TNotifyEvent的定义如下:
typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);