【问题标题】:How to identify which text box is active in real time?如何实时识别哪个文本框处于活动状态?
【发布时间】:2018-07-04 07:38:00
【问题描述】:

我有一个关于如何实时获取活动控件名称的问题。以下是详细信息。

我创建了一个允许用户输入记录的表单(请参阅附件截图)。用户可通过该表添加安徽省2000年天然气供需数据。 enter image description here

我想做的一个功能是输入某些记录时,例如安徽2000年天然气“总供应量”,表格可以柱状图显示安徽近2000年,比如1997-1999年的所有天然气“总供应量”,以供用户参考。当用户编辑“导入”时,图表会相应地切换到“导入”。

我知道 OnClick() 能够帮助我获取活动文本框的名称,但是框太多了。我想肯定还有其他一些简单的方法。而且我还觉得如果我选择不使用 OnClick(),我可能需要另一个线程来捕获活动控件的名称,但是 VBA 中似乎不支持多个线程?

非常感谢您提前提供的帮助!

【问题讨论】:

标签: ms-access


【解决方案1】:

如果您的目标是避免为每个文本框声明 OnEnter 事件,那么您可以在加载表单时动态添加事件:

Private Sub Form_Load()
    Dim ctl As Control
    For Each ctl In Me.Controls
        If TypeOf ctl Is Textbox Then
            Dim txtbox As Textbox
            Set txtbox = ctl
            txtbox.OnEnter = "=FieldEntered(""" & txtbox.Name & """)"
        End If
    Next ctl
End Sub

Public Function FieldEntered(textboxName As String)
    Debug.Print textboxName
End Function

然后您可以使用传递给FieldEntered 函数的textboxName 参数对图表执行任何您需要的操作。

您也可以只在FieldEntered 函数中使用Me.ActiveControl.Name,而不是通过参数传递它,但这主要是为了美观。

注意:要使其工作,FieldEntered 函数必须是公共函数。

另一种方法是使用 Form 的 Timer 事件,但这会影响性能,所以我认为上面的方法更健壮。

【讨论】:

    【解决方案2】:

    在表单的模块中创建一个函数:

    Private Function FieldClicked()
        Dim ctl As Control
    
        Set ctl = Me.ActiveControl
        Select Case ctl.Name
        Case "Field1"
            ....
        Case Else
            ....
        End Select
    End Function
    

    在设计模式中选择您要分析的所有文本框,并在On Click 属性类型中输入=FieldClicked()。在这种情况下,您不需要为每个字段创建 OnClick 事件处理程序 - 只需一个函数,您可以在其中分析您想要的任何内容。

    顺便说一句,为了您的目的,最好使用On Enter 事件,而不是On Click - 用户可以使用键盘而不是鼠标进入该字段。

    【讨论】:

      猜你喜欢
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多