Question

Objective: Redirect focus from one command button to another using the first's GotFocus procedure.

Context: I have a form-independent procedure in a generic module that, on most forms, sets focus to the NewRecord button after saving the previous record. But on one form, I would like to redirect (based on certain conditions) focus back to the SignRecord button so the user can "sign" a second part of the same record (I may need this for other uses in the future). The target control is enabled and visible and can otherwise be focused and the original control can be focused when the redirect doesn't occur. Reference [2] below implies that this should be possible, though I'm not changing visibility of my controls.

Issue: When the conditions are met to redirect focus in the GotFocus procedure, it redirects as desired but the original (test) SetFocus call throws a "Run-time error '2110', Can't move focus to the control CommandNew".

What I've tried:
Exit Sub after my downstream SetFocus calls.
Call CommandSign.SetFocus in the hopes that it would make it happen outside the previous SetFocus process.

In a module,

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

In the '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

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

Was it helpful?

Solution

I think your problem is that the call to Forms("TargetForm").CommandNew.SetFocus doesn't quite seem to, in fact, finish setting the focus to CommandNew until after Private Sub CommandNew_GotFocus() has finished executing. Because you've called another SetFocus before the first SetFocus could finish, there is a conflict that Access seems to be unable to cope with.

Whether or not that is the case, one thing is clear: the way you have your execution plan set up right now is unfortunately not going to work. You might try adding either a global variable or a public variable to each form that determines whether or not you should set your focus to CommandSign after you set the focus to CommandNew.

Ex. TargetForm:

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

Module:

Public Sub test()
    Forms("TargetForm").CommandNew.SetFocus
    If Forms("TargetForm").boolSetCommandSignFocusInstead Then
        Forms("TargetForm").CommandSign.SetFocus
    End If
End Sub
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top