如何检测任何控件的焦点变化?

时间:2015-07-03 20:18:33

标签: ms-access access-vba

在我的表单中,我需要检测焦点是否移动到新控件。

我是否可以为整个表单执行此操作而无需为每个控件创建事件过程?

我已经尝试过了,但似乎没有开火。

Private Sub Form_SelectionChange()
    MsgBox Screen.ActiveControl.Name
End Sub

3 个答案:

答案 0 :(得分:0)

是的,使用WithEvents。它需要一点点,文档很差,但它最终可能会得到回报:

Using Dynamic External Event Procedures

答案 1 :(得分:0)

这会在每个控件上创建一个事件(不完全是你要求的),但它非常干净。

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For Each control As Control In Controls
        AddHandler control.Enter, AddressOf ControlReceivedFocus
    Next
End Sub

Private Sub ControlReceivedFocus(sender As Object, e As EventArgs)
    MessageBox.Show(sender.ToString())
End Sub

End Class

来源:https://stackoverflow.com/a/1159481/2352507

答案 2 :(得分:0)

This thread has a solution动态地向控件添加onClick个事件。事实证明,虽然您可以添加自己的活动,但您无法添加自己的活动并且也有正常的control_click()活动。它只是你可以通过代码在运行时设置它,它可以任意命名(只要它是一个函数)。

这回答了我的问题:你可以动态地向每个控件添加一个onclick事件,而不必在gui中创建它们。如果您愿意,可以在form_onload中输入以下语法:

with Me.myControl
    Me.myControl.OnEnter = "=SomeFunction()"
end with

以下是向每个文本框控件添加.OnEnter事件的方法(只需从SetReportControls调用form_open方法:

Private Sub SetReportControls()
    Dim ctrl As Control
    For Each ctrl In Me.Controls
        With ctrl
            If TypeOf ctrl Is Access.TextBox Then
                .OnEnter = "=ReportControl(false)"
            End If
        End With
    Next
End Sub

Private Function ReportControl(Cancel As Integer)
    msgbox Screen.ActiveControl.Name
End Function
相关问题