1.场景
TForm1,TForm2分别是节点维护和节点监控窗口。
TForm1的操作如何反应到TForm2上,这是一个常见的模式类问题。
2.说明
使用事件反应器有几个主要步骤:
.定义事件,消息
.注册事件处理者:
事件处理者可以是一个全局函数或者一个TForm的消息处理函数。分别调用RegisterHandleFunc,RegisterHWNDHandler登记。
窗口消息支持同步和异步方式.消息参数由应用自行定义。
.事件激发
.解除登记
3.示例
//---------------------------------------------------------------------------
/// 登记处理器
void __fastcall TFrmBillInterface::FormCreate(TObject *Sender)
{
/// 某些情况需要在FormShow中登记,因this->Handle在OnCreate和OnShow的值不同(可能与窗口类型有关)
///< 登记事件处理函数
CUDXAdminPlugin::instance()->i_event_reactor_->RegisterHandleFunc(EVENT_UDX_DELETE_SENDCFG,::OnCfgDelete,this);
///< 登记事件消息处理器
CUDXAdminPlugin::instance()->i_event_reactor_->RegisterHWNDHandler(EVENT_CONNECTED,this->Handle,UWM_DELETE_SEND_CFG,1);
}
//---------------------------------------------------------------------------
///< 解除登记
void __fastcall TFrmBillInterface::FormClose(TObject *Sender,
TCloseAction &Action)
{
CUDXAdminPlugin::instance()->i_event_reactor_->RemoveHandleFunc(EVENT_UDX_DELETE_SENDCFG,::OnCfgDelete);
CUDXAdminPlugin::instance()->i_event_reactor_->RemoveHWNDHandler(EVENT_UDX_DELETE_SENDCFG,this->Handle);
}
//---------------------------------------------------------------------------
///< 事件处理函数
int OnCfgDelete(void *arg,void *event_arg) {
return 0;
}
//---------------------------------------------------------------------------
/// 事件消息处理函数
void __fastcall TFrmBillInterface::OnDeleteCfg(TMessage &message) {
CRule *rule = (CRule*)message.LParam;
TTreeNode *TreeNode = FindData(tvData,rule);
assert(TreeNode!=0);
tvData->Items->Delete(TreeNode);
}
//---------------------------------------------------------------------------
///< 应用头文件
private:
void __fastcall OnDeleteCfg(TMessage &message);
public:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(UWM_DELETE_SEND_CFG,TMessage,OnDeleteCfg)
END_MESSAGE_MAP(TForm)
//---------------------------------------------------------------------------
/// 修改成功后激发"发送配置修改"事件
void __fastcall TfrmViewSendCfg::doUpdateExecute(TObject *Sender)
{
CUDXAdminPlugin::instance()->i_event_reactor_->Pulse(EVENT_UDX_UPDATE_SENDCFG,m_Rule);
}
4.接口
//---------------------------------------------------------------------------
///< 反应器接口头文件
///< 事件处理函数(arg:为登记时传入的参数,event_arg为事件激发时提供的参数
typedef int (*EventHandleFunc)(void *arg,void *event_arg);
//---------------------------------------------------------------------------
class IEventReactor {
public:
///< 登记一个窗口作为指定事件的处理者
virtual int RegisterHWNDHandler(unsigned long event,HWND handle,unsigned long wmid,int sync=0) = 0;
virtual int RemoveHWNDHandler(unsigned long event,HWND handle) = 0;
///< 登记一个函数作为指定事件的处理者
virtual int RegisterHandleFunc(unsigned long event,EventHandleFunc fp,void *arg=0) = 0;
virtual int RemoveHandleFunc(unsigned long event,EventHandleFunc fp) = 0;
virtual int Pulse(unsigned long event,void *arg) = 0;
};