Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 源码示例

如何为所有窗体的文本框定义多个公共事件?

时 间:2012-05-18 08:51:28
作 者:蒋灿辉   ID:24104  城市:上海
摘 要:需要为所有的窗体的所有的文本框的获得焦点事件定义2个以上的公共方法,但是我不想一个一个去定义,该如何操作?有没有一次性就可以全部定义的方法?
正 文:

问题:

  需要为所有的窗体的所有的文本框的获得焦点事件定义2个以上的公共方法,但是我不想一个一个去定义,该如何操作?有没有一次性就可以全部定义的方法?

回答:

 
方法有很多,最简单的就是直接用Controls循环得到窗体的所有控件并定义文本框的 OnGotFocus="过程名"。但是这样只能定义一个方法,而且传参比较麻烦,不能按地址传对象。

 

另一个方法就是用 WithEvents 来委托控件的事件,但是ACCESS的form和control比较特别,需要额外设定 On....="[Event Procedure]" 否则这个事件是不会被触发的。


基本操作方法如下:
1、写一个公共的类模块,类模块公共部分 public withevents t as treeview
类里面写 on....方法

2、在需要调用这个类的窗体的公共部分 dim c(11) as new clsComm

3、在这个窗体的 form_load 用controls列举出需要委托事件的控件,放入这个类,也就是
dim i as long 
for each ctl in me.controls
    i=i+1
    set c(i).t = ctl
next


图片如下:
按此在新窗口浏览图片

图片如下:
按此在新窗口浏览图片

图片如下:
按此在新窗口浏览图片

 

实际代码如下:

类模块 clsComm

Option Compare Database
Public WithEvents t As Access.TextBox
Public WithEvents t2 As Access.TextBox

 


Private Sub t_GotFocus()
    Debug.Print "first:" & Now
    t.Text = "first:" & Now
End Sub

Private Sub t2_GotFocus()
    Debug.Print "second :" & Now()
    
    t2.Text = "second :" & Now() & vbCrLf & t2.Text
End Sub



窗体2

Option Compare Database
Dim c(11) As clsComm

 

Private Sub Command0_Click()
    Dim i As Long
    Dim ctl As Control
    
    
    
    If IsFormLoad("窗体1") = False Then
        DoCmd.OpenForm "窗体1"
    End If
    For Each ctl In Forms("窗体1").Controls
        i = i + 1
        
        Debug.Print ctl.Name
        If TypeOf ctl Is TextBox Then
            Set c(i) = New clsComm
            Set c(i).t = ctl
            '注意,ACCESS FORM 的机制和普通UserForm不一样,所以
            'clsComm中这个文本框要触发哪个事件,在这里的 t.On... = "[Event Procedure]"
            '否则这个事件是不会被触发的。
            c(i).t.OnGotFocus = "[Event Procedure]"
            Debug.Print c(i).t.OnGotFocus
            '注意,将文本框委托2遍,它会分别触发2个不同的事件。
            Set c(i).t2 = ctl
        End If
    Next
End Sub

Private Function IsFormLoad(ByVal formName As String) As Boolean
    Dim f As Form
    For Each f In Application.Forms
        If f.Name = formName Then
            IsFormLoad = True
            Exit For
        End If
        
    Next
    

End Function

Private Sub Command1_Click()
On Error Resume Next
    Dim i As Long
    For i = 0 To UBound(c) - 1
        Debug.Print c(i).t.Name, i
    Next
End Sub

Private Sub Command2_Click()
On Error Resume Next
    Dim i As Long
    For i = 0 To UBound(c) - 1
        Debug.Print c(i).t.Name, i
        '从委托列表中取消第一个委托的对象(或事件)
        If TypeOf c(i).t Is Access.TextBox Then
            Set c(i).t = Nothing
        End If
    Next
    
End Sub


Access2010 示例下载:点击下载此附件



Access软件网QQ交流群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助