Событие изменения активного управления - MS Access
Я ищу событие формы MS-Access, которое может проверить, изменился ли активный элемент управления на другой элемент управления; когда он делает маленький скрипт запускается.
Функция должна быть той, которая запускается только тогда, когда форма активна (например, щелчок по форме и т. Д.). Тем не менее, Form_Click() не работает, поскольку это как-то не то же самое окно.. Я не знаю, что там происходит. Form_Click() также работает только в том случае, если вы щелкаете элементы формы, а не элементы управления (такие как селектор записей). Этот метод должен работать для всех элементов управления с одним методом, а не одним методом на элемент управления.
мой код:
Private Sub <<Form_ActiveHasChanged()>>
desc = Forms(Me.Form.Name).Controls(Me.ActiveControl.Name).StatusBarText
Me.txtInfo.Caption = desc
End Sub
где <<Form_ActiveHasChanged()>>
мое событие.. есть ли способ сделать это? Я не могу использовать таймеры, как будто пользователь уходит от формы, Me.ActiveControl больше не находится в окне и выдает ошибку. Или, если кто-нибудь знает способ проверить:
If (Me.Form IS IN ACTIVE WINDOW) Then ....
3 ответа
Вы можете сделать это через модуль класса, используя 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
Вы можете создать отдельный обработчик событий, сохранить его в модуле, а затем просто установить его как событие OnExit для каждого элемента управления в отдельности. Просто нажмите Ctrl-A, чтобы выделить их все, откройте диалоговое окно "Свойства" и установите событие OnExit. Возьмите около 20 секунд.
Самый простой способ сделать это - использовать обработчик событий OnEnter для каждого элемента управления.