我在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的部分之前,效果不错。
现在,我试着在原来的表单中做同样的工作,但它不工作... ...
上面的问题已经在讨论中通过禁用后再启用文本框来解决,但 只在表格中做 Activate
事件. 它没有发挥作用 Initialize
活动...
Private Sub UserForm_Activate()
Me.txtCsv.Disable: Me.txtCsv.Enable
Me.txtCsv.SetFocus
End Sub