Office中国论坛/Access中国论坛

标题: 【原创 / 源码】Access控件事件集线器(EventsHub)发布贴(当前版本1.1) [打印本页]

作者: LucasLynn    时间: 2005-8-23 17:46
标题: 【原创 / 源码】Access控件事件集线器(EventsHub)发布贴(当前版本1.1)
注:最新版本请见最后的回复

模块名称: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
作者: LucasLynn    时间: 2005-8-23 19:15
实际应用范例:

窗体上有个选项卡控件中的一页: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编辑过]


作者: esmile    时间: 2005-8-23 21:42
提示: 作者被禁止或删除 内容自动屏蔽
作者: LucasLynn    时间: 2005-8-29 21:49
模块名称: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 = 捕获事件的控件(可接收窗体、窗体控件)
'以下
作者: LucasLynn    时间: 2005-9-15 19:00
EventsDistributionFrame 已经发布。
作者: cg1    时间: 2005-9-15 19:05
这个也看看
作者: tonywong    时间: 2005-9-15 23:07
ok
作者: yodong    时间: 2005-9-16 04:51
真是高手
作者: 209    时间: 2005-10-7 02:10
学习
作者: XWQ2000    时间: 2006-1-8 20:57
ok
作者: sun.gd    时间: 2006-1-27 18:58
真的很厉害
作者: sunnyfc    时间: 2006-4-17 04:54
Pretty!
作者: xjliyuehua    时间: 2006-4-17 16:56
[em02][em02]
作者: 5988143    时间: 2006-4-19 02:55
谢谢分享!
作者: xinle    时间: 2006-4-28 02:07
kk
作者: songzhha    时间: 2006-5-2 23:52
谢谢
作者: 钓鱼太郎    时间: 2006-5-25 01:30
试试看
作者: scccx8106    时间: 2006-7-16 18:13
好呀?
作者: wxmins    时间: 2006-7-20 09:52
EventsDistributionFrame
作者: ywfqd    时间: 2007-3-7 18:52
看看
作者: huhun777    时间: 2007-3-8 22:54
难,慢慢看!
作者: yelingfeng    时间: 2007-4-18 03:37
强人!
作者: 非有非无    时间: 2007-4-22 05:13
看不懂了!
作者: ls_hndd    时间: 2007-4-24 05:05
学习
作者: dqsytmh    时间: 2008-4-26 11:59
回复一下
作者: lkkl66    时间: 2008-8-3 00:40
嗅一嗅!看不懂也要品一品!
作者: shable    时间: 2008-9-4 11:55
学习学习,谢谢![:50]
作者: freeoffice    时间: 2008-10-15 20:11
sdfsafdsaf[:30] [:26]
作者: sbsfhgl    时间: 2008-10-22 10:01
好好学习,天天向上。
作者: tanhong    时间: 2008-11-29 17:26
下载学习
作者: jsjcar    时间: 2009-5-8 21:53
正需要
作者: youchytan    时间: 2009-5-27 17:20
www.office-cn.net
作者: chenyingfengsx    时间: 2009-8-17 09:50
ooook
作者: danis    时间: 2009-8-19 19:02
mark
作者: chaojianan    时间: 2009-10-24 14:58
真正的高手,谢谢分享。
作者: leijiqiang    时间: 2009-10-31 11:18
啊?????天哪~
找呀找呀~终于被我找到了~

谢谢分享~学习学习
作者: sccg    时间: 2009-11-6 23:24
tks for sharing.
作者: sagemeyou    时间: 2009-11-6 23:48
kankan
作者: fengtao666    时间: 2010-1-29 13:48
这东西真是不错,我要好好研究一下。
作者: wangling    时间: 2015-4-15 06:45
謝謝你的辛勞
作者: wangling    时间: 2015-4-15 06:47
謝謝你的辛勞




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3