【问题标题】:Get object name in callback function for VBA object?在 VBA 对象的回调函数中获取对象名称?
【发布时间】:2014-10-03 08:17:26
【问题描述】:

假设我有一个带有名为cmd_1 的命令按钮的用户窗体。

就我的申请而言,我想在此点击上进行大量验证 - 请参阅 this question 了解有关我正在尝试做什么的一些讨论。基本上,我希望根据调用对象的名称,使用我检查的逻辑规则来实现单个回调函数,以确定该控件操作的资格。

这看起来像:

private function isValid(p_controlName as string) as boolean
    'logical checks based on the the value of p_controlName
    'returning true/false as appropriate
end function

我会像这样使用它

Private Sub cmd_1_Click()
    if isValid("cmd_1") = false then exit sub
End Sub

现在我将把它放入很多 UI 回调中(我不喜欢考虑有多少)。我宁愿避免繁琐地将控件的名称添加到每个回调中。我非常非常喜欢做这样的事情:

Private Sub cmd_1_Click()
    'this is not valid syntax
    if isValid(ThisControl.name) = false then exit sub
End Sub

出于各种原因,这会更好,例如易于实施、一致性、出错的可能性较小等。

但是我似乎找不到在回调函数中获取调用控件名称的方法。

  • 是否有某种方法可以从回调函数中获取 VBA 代码中的控件名称,以用作我正在尝试的参数?

【问题讨论】:

    标签: vba ms-access ms-access-2010


    【解决方案1】:

    如果它只是按钮单击事件处理程序,那么 Screen.ActiveControl.Name 应该会得到你想要的 - Screen.ActiveControl 返回带有键盘焦点的控件,并且命令按钮将键盘焦点放在被点击上。

    【讨论】:

    • 嗯,这似乎正是我所需要的。我可能永远偏执于ActiveControl 会因为任何原因返回一个无效的控件,不过......
    【解决方案2】:

    或者,使用基于控件名称或您需要的信息的参数的每个控件的回调函数,并使每个控件具有:

    Dim rect As Control
    Dim coll As Form
    
    Set coll = Forms("myForm")
    For Each rect In coll.Controls
        If rect.ControlType = acRectangle Then
            rect.OnClick = "=myCallbackFunction(" & param & ")"
        End If
    Next rect
    

    myCallbackFunction 只是与控件在同一窗体上的函数,或者是模块中的公共函数。

    我已经这样做了,其中每个矩形(最多 100 个,在我的表单上的高度 0 处预先生成)被移动并基于记录集使其可见,然后他们根据记录集中的 ID 设置这个 onclick 事件.在我的例子中,它会选择一个不同的子表单记录来匹配点击的矩形。

    唐 祝你有美好的一天

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多