设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12345下一页
返回列表 发新帖
查看: 7168|回复: 40
打印 上一主题 下一主题

[模块/函数] 【原创 / 源码】Access控件事件集线器(EventsHub)发布贴(当前版本1.1)

[复制链接]
跳转到指定楼层
1#
发表于 2005-8-23 17:46:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
注:最新版本请见最后的回复

模块名称:EventsHub



模块版本:V 1.0



模块介绍:

  
很多时候我们在窗体中会有很多类似的控件(比方说40多个TextBox),对于这些类似的控件我们需要编制类似的事件处理程序(比方说其中任何一个TextBox内容更新后重新计算结果),这种情况下,控件的事件编程会变得很复杂,比方说例子中提到的40多个TextBox,就要写40多个事件处理程序。一旦程序要作某些调整,这些代码也要作大量的调整。

  现在让我们告别手工作坊的事件处理年代,采用新的事件处理方式,以下模块集中捕获对象的所有事件(包括子对象的事件)。初始化的时候(InitHub方法)指定你要集中捕获事件的控件(比方说窗体),然后当这个控件或者他的子控件有任何事件发生的时候,OnEvent方法都会被自动调用,并且传递给你三个参数:发生事件的对象名,发生事件的对象的路径(父节点),发生的事件名。你可以在代码中根据这些参数来判断到底发生了什么事件,然后决定怎么处理。

模块下载:



游客,如果您要查看本帖隐藏内容请回复


模块调用范例:警告:被设定捕获事件的对象,其原先定义的事件代码将全部被接管而失效。

'调用范例

rivate Sub Form_Load()

    '窗体内所有事件,包括窗体本身

    InitHub Me

    '窗体内所有按钮

    InitHub Me, acCommandButton, 2

    '窗体本身

    InitHub Me, acForm, 1

    '选项卡Page1上所有的TextBox控件

    InitHub Page1, acTextBox, 2

    '选项卡Page1上所有的TextBox控件

    InitHub Page1, acTextBox, 2

End Sub


模块源码:














<DIV class=quote>

'Access控件事件捕获器模块 EventsHub V 1.0

Option Compare Database

Option Explicit

''''''''''''''''''''''''''''''''''''''''''''''''

'初始化捕获参数:

'objDest=捕获事件的控件(可接收窗体、窗体控件)

'以下为可选参数:

'HookDestType=需要捕获事件的控件类型(0=所有类型,默认值)

'HookType=捕获类型(0=捕获控件事件和子控件事件,默认值

'                   1=只捕获控件本身事件

'                   2=只捕获子控件事件)

'EventType=事件名(""=所有事件,默认值)

''''''''''''''''''''''''''''''''''''''''''''''''

ublic Sub InitHub(ByRef objDest As Object, Optional ByVal HookDestType As AcControlType = 0, Optional ByVal HookType As Long = 0, Optional ByVal EventType As String = "")

    EventsHook objDest, "", HookDestType, HookType, EventType

End Sub

rivate Sub EventsHook(ByRef objMe As Object, ByVal strEventSource As String, _

    ByVal HookDestType As AcControlType, ByVal HookType As Long, ByVal EventType As String)

        

    Dim objCtl As Access.Control

    Dim objPrp As Object

    Dim bolMatchType As Boolean

   

    If HookDestType = 0 Then

        bolMatchType = True

    ElseIf TypeOf objMe Is Form Then

        bolMatchType = (HookDestType = acForm)

    Else

        bolMatchType = (HookDestType = objMe.ControlType)

    End If

   

    If HookType = 1 Or HookType = 0 And bolMatchType Then

        For Each objPrp In objMe.Properties

            If objPrp.Name Like "On*" And (EventType = "" Or EventType = objPrp.Name) Then

                objPrp.Value = "=OnEvent('" & strEventSource & "','" & objMe.Name & "','" & objPrp.Name & "')"

            End If

        Next objPrp

    End If

   

    If HookType = 2 Or HookType = 0 And HookDestType <> acForm Then

        strEventSource = strEventSource & IIf(strEventSource = "", "", ".") & objMe.Name

        On Error GoTo NoChild

        For Each objCtl In objMe.Controls

            EventsHook objCtl, strEventSource, HookDestType, 0, EventType

        Next objCtl

    End If



NoChild:

    Exit Sub

End Sub

'''''''''''''''''''''''''''

'用户自定义函数,入口参数:

'strParent:发生事件的对象的父对象,如:窗体1

'strObject:发生事件的对象名,如:Command0

'strEvent:发生的事件名,如:OnClick

'''''''''''''''''''''''''''


Public Function OnEvent(ByVal s

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2005-8-23 19:15:00 | 只看该作者
实际应用范例:

窗体上有个选项卡控件中的一页:Page0

其中包含了20个TextBox控件,有10个名为:参数1、参数2、……参数10,另外一个名为“总和”的TextBox绑定了表中某个字段。

要求当参数n改变的时候,总和能马上重新统计。使用传统方法,我们可能会这样写:

Private Sub 参数1_Change()

    ReCount

End Sub

Private Sub 参数2_Change()

    ReCount

End Sub

......

Private Sub 参数10_Change()

    ReCount

End Sub

Public Sub ReCount()

    总和=参数1+参数2+......+参数10

End Sub



使用事件捕获器后我们这样写:

Form_Load()

    InitHub Page0, acTextBox, 2, "OnChange"

End Sub



Public Function OnEvent(ByVal strParents As String, ByVal strObject As String, ByVal strEvent As String)

    If strObject Like "参数" Then 总和=参数1+参数2+...+参数10

End Function

使用事件捕获器的好处有两点:

1、精简代码,上述代码中如果10个参数变为100个参数,作用则更加明显。

2、代码可读性、可维护性强。

[此贴子已经被作者于2005-8-23 12:05:15编辑过]

3#
发表于 2005-8-23 21:42:00 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
4#
 楼主| 发表于 2005-8-29 21:49:00 | 只看该作者
模块名称:EventsHub

模块版本:V 1.1

模块介绍:
  
很多时候我们在窗体中会有很多类似的控件(比方说40多个TextBox),对于这些类似的控件我们需要编制类似的事件处理程序(比方说其中任何一个TextBox内容更新后重新计算结果),这种情况下,控件的事件编程会变得很复杂,比方说例子中提到的40多个TextBox,就要写40多个事件处理程序。一旦程序要作某些调整,这些代码也要作大量的调整。
  现在让我们告别手工作坊的事件处理年代,采用新的事件处理方式,以下模块集中捕获对象的所有事件(包括子对象的事件)。初始化的时候(InitHub方法)指定你要集中捕获事件的控件(比方说窗体),然后当这个控件或者他的子控件有任何事件发生的时候,OnEvent方法都会被自动调用,并且传递给你三个参数:发生事件的对象名,发生事件的对象的路径(父节点),发生的事件名。你可以在代码中根据这些参数来判断到底发生了什么事件,然后决定怎么处理。

模块更新:
1、根据Trynew的建议,加入了是否覆盖窗体原有事件定义的参数,可以避免接管窗体原有的事件定义。
2、添加了事件处理端口参数,可以供用户自定义事件处理函数进行事件分类处理。(事件集线器的雏形)
3、控件类型中添加了acAllType常数。
4、截获类型被定义为一个枚举。
5、通过自动检测禁止了模块在窗体允许更改设计模式下运行

开发计划:
1、使用HookLevel替代HookType,可任意指定截获事件的对象遍历深度。
2、将使用新的端口定义方式,至多支持32个端口并发,对一个事件进行多次重复定义将不会再被覆盖,而是采用端口并行的方式,同时激活事件处理器多个端口。
3、增加事件参数的支持。
4、预告:即将推出《事件集线器EventsHub》的高端应用版本《事件配线架EventsDistributionFrame》,将全面支持事件参数,支持端口并发,全新的安全事件截获模式,并使用用户自定义事件处理函数集合,实现完全封装。

模块下载:
游客,如果您要查看本帖隐藏内容请回复


模块调用范例:

  注意,请将调用本模块的窗体的“允许设计更改”属性设定为“仅设计视图”。以避免用户误操作引起的窗体数据错误。



'调用范例
Private Sub Form_Load()
    '窗体内所有事件,包括窗体本身
    InitHub Me, 0
    '窗体内所有按钮
    InitHub Me, 0, acCommandButton, 2
   '窗体本身
    InitHub Me, 0, acForm, 1
    '选项卡Page1上所有的TextBox控件
    InitHub Page1, 0, acAllType, 2
    '选项卡Page1上所有的TextBox控件的OnGotFocus事件,但是不接管窗体原有的事件定义
    InitHub Page1, 0, acAllType, ehHookMeChildren, "OnGotFocus", False
End Sub

''''''''''''''''''''''''''''''''''''''''''''''
'用户自定义函数,入口参数:
'strParent:发生事件的对象的父对象,如:窗体1
'strObject:发生事件的对象名,如:Command0
'strEvent:发生的事件名,如:OnClick
'intPort:事件自定义端口号,由初始化程序设定
''''''''''''''''''''''''''''''''''''''''''''''
Public Function OnEvent(ByVal intPort As Byte, ByVal strParents As String, ByVal strObject As String, ByVal strEvent As String)
    '本函数为用户自定义函数
    Debug.Print intPort & ": "; strParents & IIf(strParents = "", "", ".") & strObject & "_" & strEvent
End Function


模块源码:






Option Compare Database
Option Explicit


'扩展 acControlType
Public Const acAllType = 0


'定义 ehHookType
Public Enum ehHookType
    ehHookMeChildren = 0
    ehHookMe = 1
    ehHookChildren = 2
End Enum


''''''''''''''''''''''''''''''''''''''''''''''''
'初始化捕获参数:
'objDest = 捕获事件的控件(可接收窗体、窗体控件)
'以下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
5#
 楼主| 发表于 2005-9-15 19:00:00 | 只看该作者
EventsDistributionFrame 已经发布。
6#
发表于 2005-9-15 19:05:00 | 只看该作者
这个也看看
7#
发表于 2005-9-15 23:07:00 | 只看该作者
ok
8#
发表于 2005-9-16 04:51:00 | 只看该作者
真是高手
9#
发表于 2005-10-7 02:10:00 | 只看该作者
学习
10#
发表于 2006-1-8 20:57:00 | 只看该作者
ok
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-16 10:58 , Processed in 0.108061 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表