客户端事件反应器

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;
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值