您可能在错误的位置寻找错误。当您更改ComboBox 的Text 属性时,如果新文本与以前的文本不同,则ComboBox 的Change 事件将触发。 LostFocus 和/或 Validate 事件也可能会触发,具体取决于您的代码正在执行的操作以及表单的设置方式。
如果在Change 事件处理程序(或LostFocus 或Validate 事件处理程序,如果您正在使用它们)中发生错误,则更改组合框文本的代码中的错误处理代码永远不会被调用(这与错误处理和事件在 VB6 中的工作方式有关)。
作为一般规则,您应该始终在您的 VB6 代码中的每个例程(子、函数或属性)中放置一个错误处理程序,因为否则您永远无法确定是否会捕获每个错误。
这是一个简单的示例,它展示了错误处理可能并不总是像您认为的那样在 VB6 中发挥作用。
新建一个标准EXE工程,在默认窗体中添加一个CommandButton(Command1)和一个ComboBox(Combo1),在窗体中添加如下代码:
Private Sub Combo1_Change()
Dim a As Long
a = 1/0 '<-- this will cause a divide-by-zero runtime error'
End Sub
Private Sub Command1_Click()
On Error GoTo MyErrorHandler
'Change the combobox text.'
'This will cause the Change event to fire'
Combo1.Text = "test"
Exit Sub
MyErrorHandler:
'This code will not be executed if an error occurs in Combo1_Change...'
MsgBox "My error-handler called."
End Sub
如果您编译项目并运行生成的 EXE,则无论何时单击 Command1 都会出现运行时错误,并且程序将终止。这是因为添加的错误处理代码(示例中为MyErrorHandler)没有被调用。但是,如果您将错误处理代码添加到Combo1_Change 事件处理程序,您可以捕获错误并尝试处理它(至少可以防止程序崩溃)。
因此,我会确保每个事件过程中都有错误处理代码,如果缺少则添加它。这应该可以更容易地查明错误实际发生的位置。例如,如果您在cmbAIDFile_Change 事件过程中有代码,请确保它具有错误处理功能。我也会在您的代码中添加行号(如果您还没有):这样您就可以在错误处理代码中使用Erl 来获取发生错误的实际行号。有关如何在错误消息中记录行号的示例,请参见以下代码。
使用 Erl 报告错误消息中的行号
Private Sub cmbAIDFile_Change()
1000 On Error Goto ErrorHandler
1010 DoSomething
1020 DoSomethingElse
ErrorHandler:
1030 Dim sErrMsg As String
sErrMsg = "A fatal error occurred." & vbCrLf & vbCrLf & _
"Method: cmbAIDFile_Change" & vbCrLf & _
"Line: " & Erl & vbCrLf & _
"Err.Number: " & Err.Number & vbCrLf & _
"Err.Description: " & Err.Description
1040 MsgBox sErrMsg, vbCritical+vbOKOnly, "Fatal error"
End Sub
一旦你有了更细粒度的错误处理,你就可以开始调查为什么你只在一台机器上看到了问题,因为你应该有关于正在发生的错误的更可靠的信息,并且在一个更好的位置来确定根本原因是什么。