特定机器特有的奇怪错误......
我有一个应用程序,其中组合框的文本值设置为文档的路径(即...
cmbAIDFile.Text = clsTonyToolkit.GetSetting("ExportAIDFile",gtypmetadata.gcnnCentral) & ""
忘记所有的GetSetting过程等,只要它返回一行文字并且工作正常。
这适用于除一个以外的所有机器。这个特定的Vista机器抛出错误运行时错误0并将用户抛出程序,无论程序上的ErrorHandling如何。其他Vista机器工作正常。
感谢收到这个令人困惑的问题的任何答案。
感谢您的帮助。
该机器正在运行Vista Business 64位。
用户可以通过启用的用户帐户控制获得管理员权限。
按照提示我尝试以管理员身份运行应用程序并获得各种奇怪的响应(丢失文件,未注册的依赖项等)。已卸载该应用程序并将尝试重新安装。我认为文件夹的影子副本也可能让人感到困惑。
答案 0 :(得分:7)
您可能在错误的地方找错了。当您更改Text
的{{1}}属性时,如果新文本与上一个文本不同,则会触发ComboBox
的{{1}}事件。 ComboBox
和/或Change
事件也可能会触发,具体取决于您的代码正在执行的操作以及表单的设置方式。
如果LostFocus
事件处理程序(或Validate
或Change
事件处理程序中发生错误,如果您正在对它们执行任何操作),则错误处理代码更改组合框文本的代码将从不被调用(这与错误处理和事件在VB6中的工作方式有关)。
作为一般规则,您应该始终在VB6代码中的每个例程(Sub,Function或Property)中放置一个错误处理程序,因为您永远无法确定是否会捕获每个错误。 强>
这是一个快速示例,演示错误处理可能并不总是像您在VB6中认为的那样。
创建一个新的标准EXE项目,并将CommandButton(Command1)和ComboBox(Combo1)添加到默认表单,并将以下代码添加到表单中:
LostFocus
如果编译项目并运行生成的EXE,则只要单击Command1就会出现运行时错误,程序将终止。这是因为未调用添加的错误处理代码(示例中为Validate
)。但是,如果您将错误处理代码添加到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
事件处理程序,您可以捕获错误并尝试处理它(至少,您可以防止程序崩溃)。
因此,我会确保每个事件过程中都有错误处理代码,如果缺少则添加它。这应该可以更容易地确定错误实际发生的位置。例如,如果您在MyErrorHandler
事件过程中有代码,请确保它有错误处理。我也会在您的代码中添加行号(如果您还没有它们):这样您就可以在错误处理代码中使用Combo1_Change
来获取发生错误的实际行号。有关如何在错误消息中记录行号的示例,请参阅以下代码。
使用Erl报告错误消息中的行号
cmbAIDFile_Change
一旦你有更细粒度的错误处理,你就可以开始研究为什么你只在一台机器上看到问题,因为你应该有关于正在发生的错误的更可靠的信息,并且在找出根本原因的更好的位置。
答案 1 :(得分:1)
vista机器有什么区别?
Al会对应用程序的工作方式产生影响。
答案 2 :(得分:1)
Mike Spears建议你在所有事件中放置错误处理程序所需的资金是正确的,因为将字符串分配给组合框的文本会导致许多事件被触发。
我的贡献是尝试以下方法。
Dim TempS as String
TempS = clsTonyToolkit.GetSetting("ExportAIDFile",gtypmetadata.gcnnCentral) & ""
cmbAIDFile.Text = TempS
Unicode可能会有一些时髦的事情。这由正常分配的错误0“无效的过程调用或参数”指示。再次,如果您有cmbAIDfile的事件过程,那么您需要捕获它们,以便您可以看到是否发生错误。
答案 3 :(得分:0)
使用这些代码
Private Sub Command1_Click()
On Error Resume Next
'Your combo-box code here
On Error GoTo 0
End Sub