SetFocus在由另一个SetFocus启动的GotFocus过程中

时间:2013-06-27 14:33:45

标签: vba ms-access setfocus

目标:使用第一个GotFocus程序将焦点从一个命令按钮重定向到另一个命令按钮。

上下文:我在通用模块中有一个与表单无关的过程,在大多数表单中,在保存前一个记录后将焦点设置为NewRecord按钮。但是在一种形式上,我想重定向(基于某些条件)焦点回到SignRecord按钮,以便用户可以“签署”同一记录的第二部分(我可能需要将其用于将来的其他用途)。目标控件已启用且可见,否则可以聚焦,并且可以在未发生重定向时聚焦原始控件。下面的参考文献[2]暗示这应该是可能的,尽管我没有改变我的控件的可见性。

问题:当满足条件以将焦点重定向到GotFocus过程时,它会根据需要重定向,但原始(测试)SetFocus调用会抛出“运行时错误'2110',可以不要将焦点移到控制CommandNew上。

我尝试了什么:
我的下游Exit Sub致电后SetFocus Call CommandSign.SetFocus希望它能够在之前的SetFocus流程之外实现。{

在模块中,

Public Sub test()
    Forms("TargetForm").CommandNew.SetFocus 'This gets the error '2110'
End Sub

在'TargetForm'中,

Private Sub CommandNew_GotFocus()
    If IsNull(textDateTime) Then Exit Sub 'Works as expected

    'I can see these two parts work. The framSign value changes 
    'and CommandSign gets focus
    If checPPC And IsNull(textSigID_PPC) And framSign = 2 Then
        framSign = 1
        CommandSign.SetFocus
    ElseIf checDAS And IsNull(textSigID_DAS) And framSign = 1 Then
        framSign = 2
        CommandSign.SetFocus
    End If
End Sub

参考文献:
[1]:SelectNextControl() a bad idea in a GotFocus event?
[2]:http://www.access-programmers.co.uk/forums/showthread.php?t=100071

1 个答案:

答案 0 :(得分:2)

认为你的问题是,对Forms("TargetForm").CommandNew.SetFocus的调用实际上似乎没有完全将焦点设置为CommandNew,直到{{1}之后已完成执行。因为你在第一个SetFocus完成之前调用了另一个SetFocus,所以Access似乎无法应对。

无论是否是这种情况,有一件事是清楚的:遗憾的是,您现在设置执行计划的方式不会起作用。您可以尝试向每个表单添加全局变量或公共变量,以确定在将焦点设置为Private Sub CommandNew_GotFocus()之后是否应将焦点设置为CommandSign

实施例。 TargetForm:

CommandNew

模块:

Public boolSetCommandSignFocusInstead As Boolean

Private Sub CommandNew_GotFocus()
    If IsNull(textDateTime) Then Exit Sub 'Works as expected

    'I can see these two parts work. The framSign value changes 
    'and CommandSign gets focus
    If checPPC And IsNull(textSigID_PPC) And framSign = 2 Then
        framSign = 1
        boolSetCommandSignFocusInstead = True
    ElseIf checDAS And IsNull(textSigID_DAS) And framSign = 1 Then
        framSign = 2
        boolSetCommandSignFocusInstead = True
    Else
        boolSetCommandSignFocusInstead = False
    End If
End Sub