【问题标题】:How to detect focus change to any control?如何检测任何控件的焦点变化?
【发布时间】:2015-07-03 20:18:33
【问题描述】:

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

我可以为整个表单执行此操作而不必为每个控件创建事件过程吗?

我试过这个,但它似乎没有触发。

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

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

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

    Using Dynamic External Event Procedures

    【讨论】:

    • 哇,这是一种方法的改变。我喜欢它 - 感谢您的参考。现在我只需要消化它。
    • 我可以在控件上的常规点击事件旁边执行此操作吗?
    • 这将让我为尚未使用任何事件的控件创建事件;但是我该怎么做呢?
    • 就这么做吧。加载和卸载表单时会引用带有 WithEvents 代码的类模块。您可以引用多个类 - 这是智能部分 - 因此您可以为您可能需要的给定表单添加该功能。这些将与您可能拥有或可能添加的任何“正常”代码隐藏表单一起使用。
    【解决方案2】:

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

    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

    【讨论】:

    • 这是一种有趣的方式。我可以在 for 循环中过滤掉一些不必要的控件。感谢您的快速回答。
    • 很抱歉,但您似乎无法在 VBA 中执行此操作。首先,没有任何addhandler,您必须在for each 语句中使用对父表单的引用。看到这个线程:social.msdn.microsoft.com/Forums/en-US/…
    • 那是 VB.NET。你需要 VBA。
    【解决方案3】:

    This thread has a solutiononClick 事件动态添加到控件。事实证明,尽管您可以添加自己的事件,但您不能添加自己的事件并拥有正常的 control_click() 事件。只是你可以在运行时通过代码设置,可以任意命名(只要是函数)。

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

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

    下面是如何将.OnEnter 事件添加到每个文本框控件(只需从form_open 调用SetReportControls 方法:

    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
    

    【讨论】:

    • 不要这样做。它是 Access 1.x 的遗留物,在该版本中您没有代码隐藏表单模块的选项。它可能会起作用,但您会丢失错误处理,而且更糟糕的是,维护它是一场噩梦,因为您无法轻松搜索或浏览在哪里调用了哪些函数。
    • 其实在GUI的属性中查看控件时,可以看到附加了该功能。不过,您可能对错误处理是正确的。
    • 是的,您一次只能看到一个控件。但这是一个非常缓慢的过程。
    猜你喜欢
    • 2010-11-12
    • 2012-05-27
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多