Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> 窗体  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701847
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

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

作者:cg1  摘自:access911.net  :cg1  更新日期:2012-5-13  浏览人次:

 

问题:

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

 

回答:


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

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

Access2010 示例下载:
http://access911.net/down/eg/eg_withevents.rar
(37.7KB)


基本操作方法如下:

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


 

本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利