VB程序中处理随机事件(2) 调用),就产生这一事件.接收器的建立者就截获这一事件,并处理消息。为了避免接收不 必要的消息,声明了minMsg、maxMsg两个变量,以便对VbMsg中的iType属性进行过 滤。 Option Explicit ' 说 明: ' 客 户 消 息 接 收 类 ' 定 义 接 收 消 息 事 件, 该 对 象 的 宿 主 类 应 截 获 该 事 件, 并 处 理接 收 到 的 消 息。 Public Event RecMsg(ByVal msg As VbMsg) ' 通 过 设 置 消 息 的 接 收 范 围, 可 以 过 滤 掉 不 需 要 的 消息 Public minMsg As Long Public maxMsg As Long ' 该 对 象 的 标 志 编 号, 使 用 时 不 应 修 改 该 值 Public ID As Long ' 事 件 产 生 过 程, 只 应 由 消 息 服 务 器(MsgServer) 调 用 Public Sub SetMsg(msg As VbMsg) If msg.iType >= minMsg And msg.iType <= maxMsg Then RaiseEvent RecMsg(msg) End If End Sub ' ' 根 据ID, 返 回 对 象 的 关 键 字, 只 应 由 消 息 服 务 器(MsgServer)调 用 Public Property Get Key() As String Key="ID:" & ID End Property 类模块之三:Global.bas ---- 本模块声明了两个全局变量,一个是接收器(MsgClient)列表(Clients),一个是接收器计数器,以为每个接收器分配一个唯一的ID标志。把变量放在单独的模块中,是为了实现数据在进程间的共享,是跨进程间消息传递的关键所在。(应保证在编译时工程是单线程的,否则数据共享则不能实现。)。 Option Explicit / 说 明: / 消 息 服 务 器 全 局 变 量 /消 息 接 收 客 户 列 表 Public Clients As New Collection / 消 息 接 收 客 户ID 计 数 器 Public CliCount As Long 类模块之四:MsgSrv.cls----本模块中定义了消息服务器类MsgServer,该类是消息广播引擎的主体,它主要管理维护消息接收器列表(Clients),将发送来的消息(调用SendMsg过程)依次发送给列表中的所有接收器。注意,这个类被声明为公共全局类,这主要是为了方便使用(不必在每个程序中再建立该类,过程名全局有效)。 Option Explicit /说 明: /消 息 服 务 器 类 /发 送 消 息 Public Sub SendMsg(msg As VbMsg) Dim c As MsgClient For Each c In Clients c.SetMsg msg DoEvents Next c End Sub /增 删 消 息 接 收 客 户 Public Sub AddMsgClient(c As MsgClient) CliCount = CliCount + 1 c.Id = CliCount Clients.Add c, c.Key End Sub Public Sub DelMsgClient(c As MsgClient) Clients.Remove c.Key If Clients.Count = 0 Then CliCount = 0 End Sub 到这里,一个小巧灵活的消息广播引擎就完成了,它的使用范围很广,用起来也很方便,只需在工程中引入编译过的ActiveX部件,就可以直接调用SendMsg发送消息,可能在安装消息接收器(MsgClient)时会稍许有点麻烦,下面举一个简单的应用例子大致说明一下: