如何在 VBA 表单的初始化激活事件中把焦点发送到文本框?

问题描述 投票:2回答:1

我在Corel公司有一个VBA表格。最初,当表单初始化事件过去只包含一些代码行时,简单的结尾行。me.txtCsv.Setfocus 用来发送焦点在它。我的意思是,它出现在编辑模式下,光标在里面闪烁。

过了一段时间,在应用程序变得复杂之后,我无法将焦点发送到讨论中的文本框上。

我知道Activate事件是最后一个发生的,而且我还在它里面有以下一行 me.txtCsv.Setfocus. 但是没有得到预期的结果。在Initialization事件代码中,我插入了这样一行代码 Debug.Print Me.ActiveControl.Name & " - 1",在2中变1,3中变3,直至6中变多处,包括最后一行,并且一直在立即窗口中出现讨论中的文本框(txtCsv)的名称。

所以。讨论中的控制是激活的控制但加载表格时,光标不在其中。

TabStop 被设置为 True. 我设置了 TabIndex 为0。

控件已经启用,没有被屏蔽。我创建了一个有三个文本框的新的简单的表单,它工作得很好,我的意思是我想发送焦点的文本框,在表单加载时有焦点,在Initialize或Activate事件中保持类似的代码。

我的意思是,我想发送焦点的文本框,在表单加载时就有焦点,在它的Initialize或Activate事件中保持一个类似的代码。

当我从窗体上的另一个控件发送焦点时,讨论中的文本框收到了焦点。

只有当窗体显示时,它才会接收焦点(不再),焦点由Initialize或Activate发送。

事件代码。

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

是否还有其他的东西,在你的脑海中划过,有待测试?

与此同时,我又分别做了一些测试。

我创建了一个新的项目(.GMS文件),并导入了讨论中的表单。 我开始注释所有Initialize事件的代码,除了最后两行代码。

它没有设置焦点! 注释一切,只让Activate事件代码,它的工作。

我开始取消注释Initialize事件代码中的行,我发现有一行不允许将焦点发送到该文本框。

设置combo的值。Me.cbPrinters.Value = Me.cbPrinters.List(0)在Activate事件代码中,将其移到指向txtCSV的部分之前,效果不错。

现在,我试着在原来的表单中做同样的工作,但它不工作... ...

vba textbox setfocus
1个回答
1
投票

上面的问题已经在讨论中通过禁用后再启用文本框来解决,但 只在表格中做 Activate 事件. 它没有发挥作用 Initialize 活动...

Private Sub UserForm_Activate()
    Me.txtCsv.Disable: Me.txtCsv.Enable
    Me.txtCsv.SetFocus
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.