Vba 具有可见控件的窗体是否可以没有具有焦点的控件?
我有一些使用ActiveControl属性的Access VBA代码。如果碰巧没有焦点控制,则会抛出错误。如果总是有可见的控件可以聚焦,我需要担心吗?也就是说,在一种总是有控件可以具有焦点的形式中,有没有任何方法可以使没有控件具有焦点Vba 具有可见控件的窗体是否可以没有具有焦点的控件?,vba,ms-access,Vba,Ms Access,我有一些使用ActiveControl属性的Access VBA代码。如果碰巧没有焦点控制,则会抛出错误。如果总是有可见的控件可以聚焦,我需要担心吗?也就是说,在一种总是有控件可以具有焦点的形式中,有没有任何方法可以使没有控件具有焦点 我看到其他一些关于相关问题的帖子。它们似乎表明,唯一的方法(如果我想使用VBA来阻止任何控件具有焦点)是将焦点设置为某个物理隐藏(但visible=True)控件。这意味着没有控制就没有办法聚焦。但是我想明确地问这个问题。否。如果窗体具有可见且已启用的控件(!),
我看到其他一些关于相关问题的帖子。它们似乎表明,唯一的方法(如果我想使用VBA来阻止任何控件具有焦点)是将焦点设置为某个物理隐藏(但visible=True)控件。这意味着没有控制就没有办法聚焦。但是我想明确地问这个问题。否。如果窗体具有可见且已启用的控件(!),则其中一个控件将始终具有焦点,如果窗体具有焦点
尽管如此,如果没有控制(因为3年后,有人决定必须禁用所有控制)或意外控制(有人后来添加),您应该练习防御性编程,不要让代码崩溃是活动窗体。您肯定可以拥有一个活动窗体,该窗体具有可见且已启用的控件,该窗体具有焦点,但没有活动控件。这两个控件的文档都有,并提到:“如果在使用ActiveControl属性时没有控件具有焦点,或者如果所有活动窗体的控件都被隐藏或禁用,则会发生错误。” 这里有一个简单而常见的例子。创建一个带有按钮和标签的简单启动屏幕。我已经制作了这一个弹出窗口和模式,但这两个设置似乎对我们的测试都不重要 接下来,创建一个
FORM\u LOAD()
事件和一个FORM\u CURRENT()
,即使后面有以下代码:
Private Sub Form_Current()
' Debug.Print Screen.ActiveControl.Name
' Debug.Print Me.ActiveControl.Name
End Sub
Private Sub Form_Load()
On Err GoTo PrintError
' Me.SetFocus
Me.lbSample.Caption = "Welcome to my Application"
' Debug.Print Form.ActiveControl.Name
' Debug.Print Screen.ActiveControl.Name
ExitHere:
Exit Sub
PrintError:
Debug.Print Err.Description & " (" & Err.Number & ")"
GoTo ExitHere
End Sub
现在,通过从LOAD()或CURRENT()事件下的Screen.ActiveControl
或form.ActiveControl
语句中删除注释标记来测试“ActiveControl”属性
即使我正在设置标签的标题,它也不会使其成为活动控件。此外,给窗体本身设置焦点或设置form.Visible=True
都不足以激活控件:无论您尝试以何种方式通过Screen.ActiveControl
或form.ActiveControl
访问属性,您仍然会收到错误2474:
我尝试过,但无法在事件子对象本身或FORM\u error()
事件中捕获此错误
所以这里有一个非常常见的情况——闪屏——没有活动控件。你可以通过测试一个有焦点的控件来解决这个问题,这取决于你想要完成什么