Search code examples
vbatextboxsetfocus

How to send focus to a text box of a VBA form during its initialization/activate event?


I have a VBA form in Corel. Behaving exactly like a similar one in Excel... Initially, when the form initialize event used to contain only some lines of code, the simple ending line me.txtCsv.Setfocus used to send the focus on it. I mean, it appeared being in edit mode with the cursor blinking inside.

After a period of time, after the application became complex, I am not able to send the focus to the text box in discussion.

I know that Activate event goes last and I also have in it the line me.txtCsv.Setfocus. But without expected result. Inside the Initialization event code I inserted that line Debug.Print Me.ActiveControl.Name & " - 1", changing 1 in 2, 3 up to 6 in many places, including the last line and all the time the name of the text box in discussion (txtCsv) appears in Immediate Window.

So, the control in discussion is the activate one, but the cursor is not inside it when the form is loaded.

TabStop is set to True. I set the TabIndex to 0.

The control is enabled and not blocked. I have created a new simple form with three text boxes and it works well.

I mean the text box which I want to send the focus, has the focus when the form is loaded, keeping a similar code in its Initialize or Activate events. I compared all properties of the two forms and all text box controls and they are the same...

When I send the focus from another control on the form, the text box in discussion receives it.

It does not receive the focus (anymore) only when the form is shown, the focus being sent by Initialize or Activate evens.

Events code:

Private Sub UserForm_Activate()
    Me.txtCsv.SetFocus
End Sub
Private Sub UserForm_Initialize()
   Dim P As Printer, i As Long, NrImp As Long, prDefault As String, strJustEngr As String
   Dim Printers() As String, n As Long, s As String, boolFound As Boolean
   Dim strEng As String, MEngr As Variant, m As Variant, el As Variant, defSize As String
   Dim strDropbox As String

   boolOpt = True: boolFound = False
   Me.cbPrinters.Clear
    If Me.chkNewStyle.Value = True Then boolNewStyle = True

    prDefault = Application.Printers.Default.Name

    strEng = GetSetting(ECA_K, ECA_set, ECA_Engr, "No settings...")
    If strEng <> "No settings..." Then
        boolSelectedEngravers = True  ' only adding engraver is possible...
        MEngr = Split(strEng, "|")
        'Incarcare in combo:
        Me.cbPrinters.Clear
        For Each el In MEngr
            m = Split(el, ":")
            Me.cbPrinters.AddItem m(0)
            If m(0) = prDefault Then
                boolFound = True
                defSize = m(1)
            End If
        Next
        Me.cbPrinters.Value = Me.cbPrinters.List(0)
        With Me.btChoosePrinters
            .Caption = "Add an Engraver"
            .ControlTipText = "Add another Engraver(must be installed)" 
        End With
        Me.btEliminatePrinters.Enabled = True
        Me.lblPrinters.Caption = "Engravers: "
        Me.cbPrinters.ControlTipText = "Select Engraver to be used!"
    Else
        Printers = GetPrinterFullNames()
        For n = LBound(Printers) To UBound(Printers)
            Me.cbPrinters.AddItem Printers(n)
            If Printers(n) = prDefault Then boolFound = True
        Next n
        boolSelectedEngravers = False
    End If
    Debug.Print Me.ActiveControl.Name & " - 1"
    If boolFound Then
        Me.cbPrinters.Value = prDefault
    Else
        Me.lblStatus.Caption = "The default printer (""" & prDefault & """) is not a laser Engraver..."
    End If


    If GetSetting(ECA_K, ECA_set, "LowRAM", "No settings...") <> "No settings..." Then
        boolLowRAM = CBool(GetSetting(ECA_K, ECA_set, "LowRAM", "No settings..."))
    End If
    If boolLowRAM = True Then
        Me.chkLowRAM.Value = True
    Else
        Me.chkLowRAM.Value = False
    End If
    Debug.Print Me.ActiveControl.Name & " - 2"
    'Direct engrave setting:
    Dim strDirectEngrave As String
    strDirectEngrave = GetSetting(ECA_K, ECA_set, ECA_Direct_Engrave, "Nothing")
    If strDirectEngrave <> "Nothing" Then
        Me.chkDirectEngrave.Value = CBool(strDirectEngrave)
        If CBool(strDirectEngrave) = True Then
            boolDirectEngrave = True
        Else
            boolDirectEngrave = False
        End If
    End If
    '_______________________________________
    strJustEngr = GetSetting(ECA_K, ECA_set, ECA_Just_Engrave, "Nothing")
    If strJustEngr <> "Nothing" Then
        'Application.EventsEnabled = False
            boolChangeEngr = True
            Me.chkJustEngrave.Value = CBool(strJustEngr)
            boolChangeEngr = False
        'Application.EventsEnabled = True
        If CBool(strJustEngr) = True Then
            Me.chkDirectEngrave.Enabled = True
            boolJustEngrave = True
            Me.frLocFoldPath.Enabled = True
        Else
            Me.frLocFoldPath.Enabled = False
            Me.chkDirectEngrave.Enabled = False
        End If
    End If
    Debug.Print Me.ActiveControl.Name & " - 3"

    If boolSelectedEngravers Then
        Application.EventsEnabled = False
            Me.btGo.ForeColor = RGB(45, 105, 7)
            Me.txtCsv.BackColor = RGB(153, 255, 51)
            Me.btGo.Enabled = False
            Me.txtCsv.SetFocus
        Application.EventsEnabled = True
    End If
    strDropbox = GetSetting(ECA_K, ECA_set, ECA_Dropbox, "No value")
    If strDropbox <> "No value" Then
        If CBool(strDropbox) = True Then
            Me.chkDropbox.Value = True
        End If
    End If
    AllRefresh
    Me.chkCloseDoc.Value = True
    Me.txtCsv.SetFocus
    Debug.Print Me.ActiveControl.Name & " - 4"
End Sub
Private Sub AllRefresh()    
    Application.Optimization = False
    Application.EventsEnabled = True
    If Documents.Count > 0 Then
        ActiveWindow.Refresh
        ActiveDocument.PreserveSelection = True
    End If
    Application.Refresh
End Sub

Is there something else, crossing your mind, to be tested?

In the meantime I did some more tests, respectively:

I created a new project (.GMS file) and I imported the form in discussion.I started commenting all the Initialize event code, except the last two code lines.

It didn't set the focus! Commenting everything, letting only the Activate event code, it worked.

I started to un-comment lines in Initialize event code and I found a line not allowing the focus to be sent to that text box.

Setting the value of the combo: Me.cbPrinters.Value = Me.cbPrinters.List(0), moving it in the Activate event code, before the part pointing to txtCSV, worked well.

Now, I tried to do the same in the original form and it does not work...


Solution

  • The above question has been solved by Disabling followed by Enabling of the text box in discussion, but only doing that in Form Activate event. It did not work in Initialize event...

    Private Sub UserForm_Activate()
        Me.txtCsv.Disable: Me.txtCsv.Enable
        Me.txtCsv.SetFocus
    End Sub