Search code examples
vbams-accessms-access-2016

Access VBA Stopped showing ActiveControl Is the focused control


I have a bit of an oddball problem. I use a routine to check focus; and ... it stopped working. I have no idea how or why.

The routine basically checks to see if the active control is the one you're checking, and if so, returns true (so we can handle the cases where it's not).

However...it recently started returning false all the time (we didn't change anything, we only noticed when some field auditing started returning weird values). Even when the control is focused, and if there's no other controls on the form, or only one form open, and the form clearly has focus.

Does anyone have any ideas how or why this might be? It's confounding me. As you can see, I've got a test field, where we're running an init in it...and the values clearly match, name, values, every field compared, and it still doesn't return true.

What am I doing wrong?

Edit: forgot to add the code. The whole thing as-is:

' I call it from here: 
' Inside form, any control, say `PurchaseCostBox`

Private Sub PurchaseCostBox_AfterUpdate()
    ' Check if the focus is had
    If VerifyFocus(Me.PurchaseCostBox) Then
        ' Save more field info.
        Debug.Print Me.PurchaseCostBox.SelStart
        Debug.Print Me.PurchaseCostBox.SelLen
        Debug.Print Me.PurchaseCostBox.Value
    Else
        ' Do limited stuff
        Debug.Print Me.PurchaseCostBox.Value
    End if
End Sub

Public Function VerifyFocus(ByRef ctlWithFocus As Control) As Boolean

    Dim FrmParent As Form
    Dim ctlCurrentFocus As Control
    On Error Resume Next
    ' Determine parent form for control
    
    ' Verify focus of parent form
    Set FrmParent = Screen.ActiveForm
    
    ' Verify focus of control on form
  
    Set ctlCurrentFocus = FrmParent.ActiveControl
    If Not ctlCurrentFocus Is ctlWithFocus Then
        ctlWithFocus.SetFocus
        DoEvents
    End If
    ' Even adding the below line does not return true:
    ctlWithFocus.SetFocus

    ' Return true if the control currently has the focus
    VerifyFocus = FrmParent.ActiveControl Is ctlWithFocus
    
    ' Discard any errors
    Err.Clear
    
End Function

I've also had it try this:

Public Function VerifyFocus(ByRef ctlWithFocus As Control) As Boolean

    On Error Resume Next
    ' Return true if the control currently has the focus
    VerifyFocus = Screen.ActiveControl Is ctlWithFocus
    
    ' Discard any errors
    Err.Clear
    
End Function

Neither work any more...and I'm floundering.

enter image description here ControlWithFocus


Solution

  • Well, this turned out to be something utterly unexpected, and totally unrelated to the focus.

    Turns out, one of the ways I call this is by getting a control's parent, by using Control.Properties.Parent.Form. While this DOES return the correct form, it also makes the above VerifyFocus routine never return true, ever (even when it's not being used). I don't know why. I really, at this point, don't care. But I'm going to leave it here for others to find.

    Refactoring my GetTopForm routines allowed me to get the focus.