在 vb6 中填充组合框时出现运行时错误 0
Posted
技术标签:
【中文标题】在 vb6 中填充组合框时出现运行时错误 0【英文标题】:Run-time error 0 when populating a combo box in vb6 【发布时间】:2008-11-28 11:50:49 【问题描述】:特定机器特有的奇怪错误...
我有一个应用程序,其中组合框的文本值设置为文档的路径(即...
cmbAIDFile.Text = clsTonyToolkit.GetSetting("ExportAIDFile",gtypmetadata.gcnnCentral) & ""
忘记所有的 GetSetting 过程等,只要它返回一行文本并且工作正常。
这在除一台机器之外的所有机器上都能正常工作。这台特定的 Vista 机器抛出错误 Run-time error 0 并将用户抛出程序,而不管过程中的 ErrorHandling 是什么。其他 Vista 机器工作正常。
我们将不胜感激地收到对这个令人困惑的问题的任何答案。
感谢您的帮助。
机器正在运行 Vista Business 64 位。
用户可以通过打开的用户帐户控制获得管理员权限。
按照您的提示,我尝试以管理员身份运行该应用程序并得到各种奇怪的响应(缺少文件、未注册的依赖项等)。已卸载该应用程序并将尝试重新安装。我认为文件夹的卷影副本也可能令人困惑。
【问题讨论】:
我发现它也可以使用文本框,但只是这台机器。 您确定问题不在 GetSettings 中吗?您可以尝试将函数的结果添加到临时变量中以找出导致问题的原因。 是的,试过了。 GetSettings 没问题。 【参考方案1】:您可能在错误的位置寻找错误。当您更改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
一旦你有了更细粒度的错误处理,你就可以开始调查为什么你只在一台机器上看到了问题,因为你应该有关于正在发生的错误的更可靠的信息,并且在一个更好的位置来确定根本原因是什么。
【讨论】:
这种行为在所有机器上是否都相同,因为它是 VB6 中的一个已知问题? (我进行了测试以确认。)这并不能解释为什么 Ton'y 只在一台机器上看到问题。 @Jeff:你是对的,它没有,但它可能会帮助他找到在 Vista 上实际失败的代码行。他正在查看更改 Text 属性的代码行;但是,我打赌代码在某处的事件处理程序中出错了...... 我在回答中的建议是,他将错误处理添加到他可能拥有的任何事件处理程序中,这样他就可以在更接近实际发生的位置捕获错误。我们看不到的代码可能正在做很多事情,这些事情可能在一台机器上而不是另一台机器上失败...... @Mike:我从版本 3 开始就使用 VB,并且一直没有遇到过这种情况,这就是为什么我必须运行你的代码示例才能相信它。我想我总是为我的所有事件提供事件处理程序。这是 MSFT 的一次重大失误。令人惊讶的是,这种行为仍然存在。 在组合框的 Change 事件中确实有一些代码,该代码为配置表单上的控件执行各种工作。我提供的代码发生在 form_load 事件中,我怀疑并非所有控件都已初始化。【参考方案2】:vista机器有什么区别?
版本 设置 用户权限AI 会影响应用程序的工作方式。
【讨论】:
【参考方案3】:Mike Spears 的建议是正确的,因为您需要将错误处理程序放入所有事件中,因为将字符串分配给组合框的文本会导致许多事件触发。
我的贡献是尝试以下。
Dim TempS as String
TempS = clsTonyToolkit.GetSetting("ExportAIDFile",gtypmetadata.gcnnCentral) & ""
cmbAIDFile.Text = TempS
Unicode 可能会发生一些奇怪的事情。这由错误 0“无效的过程调用或参数”指示,否则为正常分配。同样,如果您有 cmbAIDfile 的事件过程,那么您需要捕获它们,以便查看那里是否发生错误。
【讨论】:
【参考方案4】:使用这些代码
Private Sub Command1_Click()
On Error Resume Next
'Your combo-box code here
On Error GoTo 0
End Sub
【讨论】:
以上是关于在 vb6 中填充组合框时出现运行时错误 0的主要内容,如果未能解决你的问题,请参考以下文章
如果未提供位置,则在报告错误时必须提供节点。运行 ESLint 7.11.0 时出现 no-unused-vars 错误