问题:
|
需要为所有的窗体的所有的文本框的获得焦点事件定义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 示例下载:
点击下载此附件