我正在寻找一个 MS-Access 表单事件,它可以检查表单上的活动控件是否已更改为另一个控件;当它执行时,会运行一个小脚本。
该函数必须是仅在表单处于活动状态(例如单击表单等)时运行的函数。但是, Form_Click() 不起作用,因为它在某种程度上不是同一个窗口。我不知道那里发生了什么。 Form_Click() 也仅在您单击表单而不是控件(例如记录选择器)时才起作用。此方法应该适用于使用一种方法的所有控件,而不是每个控件使用一种方法。
my code:
Private Sub <<Form_ActiveHasChanged()>>
desc = Forms(Me.Form.Name).Controls(Me.ActiveControl.Name).StatusBarText
Me.txtInfo.Caption = desc
End Sub
where <<Form_ActiveHasChanged()>>
是我的活动..有办法做到这一点吗?我无法使用计时器,就好像用户离开表单一样,Me.ActiveControl 不再位于窗口中并引发错误。或者,如果有人知道一种检查方法:
If (Me.Form IS IN ACTIVE WINDOW) Then ....
您可以通过类模块使用WithEvents
。不幸的是,没有任何事件附加到通用Control
对象,因此您必须为每种不同类型的控件指定一个处理程序。我提供了三个常用控件来帮助您入门。
创建一个新的类模块,命名为weControlChange
并将以下代码粘贴到其中。然后按照类模块顶部的使用注释来实现。
' Usage: 1. Add the following to the declaration section of the form module:
' Dim ControlChange As New weControlChange
' 2. Add the following to the Form_Load OR Form_Open event:
' ControlChange.Setup Me.Form
Option Compare Database
Option Explicit
Private WithEvents weTextBox As TextBox
Private WithEvents weComboBox As ComboBox
Private WithEvents weCheckBox As CheckBox
Private CtlColl As Collection
Public Sub Setup(Frm As Form)
Dim Ctl As Control, CtlChng As weControlChange
Set CtlColl = New Collection
For Each Ctl In Frm.Section(acDetail).Controls
'For Each Ctl In Frm.Controls ''to include controls from all sections'
Select Case Ctl.ControlType
Case acTextBox, acComboBox, acCheckBox
If Ctl.Enabled And Ctl.Visible Then
Set CtlChng = New weControlChange
Set CtlChng.Control = Ctl
CtlColl.Add CtlChng
End If
End Select
Next Ctl
End Sub
Public Property Set Control(ByVal Ctl As Control)
Select Case Ctl.ControlType
Case acTextBox
Set weTextBox = Ctl
weTextBox.OnEnter = "[Event Procedure]"
Case acComboBox
Set weComboBox = Ctl
weComboBox.OnEnter = "[Event Procedure]"
Case acCheckBox
Set weCheckBox = Ctl
weCheckBox.OnEnter = "[Event Procedure]"
End Select
End Property
Private Sub weCheckBox_Enter()
MyScript weCheckBox
End Sub
Private Sub weComboBox_Enter()
MyScript weComboBox
End Sub
Private Sub weTextBox_Enter()
MyScript weTextBox
End Sub
Private Sub MyScript(Ctl As Control)
'Your code goes here
End Function
Private Sub Class_Terminate()
Dim Ctl As Object
On Error Resume Next
If Not CtlColl Is Nothing Then
For Each Ctl In CtlColl
Set Ctl = Nothing
Next Ctl
Set CtlColl = Nothing
End If
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)