Вопрос по ms-access, vba – Событие изменения активного управления - MS Access

3

Я ищу событие формы 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 ....
Проблема в том, что я хочу, чтобы он работал на всех элементах управления в форме; У меня более 30 элементов управления в некоторых формах (многочисленные вкладки). Также я считаю, что Lost_Focus () также страдает от "элемента управления нет в активном окне". ошибка. Я уточню свой вопрос немного подробнее. StuckAtWork
Lost Focus не подходит? После этого API могут подойти. Fionnuala

Ваш Ответ

3   ответа
0

nter для каждого элемента управления.

2

сохранить его в модуле, а затем просто установить его как событие OnExit для каждого элемента управления в отдельности. Просто нажмите Ctrl-A, чтобы выделить их все, откройте диалоговое окно «Свойства» и установите событие OnExit. Займет около 20 секунд.

Поздний комментарий, но это тоже должно сработать ... Я не знал, что вы можете выбрать несколько параметров и установить пакетные свойства. +1 за новую информацию! StuckAtWork
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

Похожие вопросы