在许多编译语言中,Debug.Assert
出于性能原因,对或等效的调用被排除在编译后的生产代码中。但是,对Debug.Assert的调用似乎仍在/runtime
MS Access应用程序的版本中执行。
为了对此进行测试,我在启动表单中添加了以下内容:
Private Sub Form_Load()
Debug.Assert UserOK()
End Sub
Function UserOK() As Boolean
UserOK = MsgBox("Is everything OK?", vbYesNo, "Test Debug.Assert") = vbYes
End Function
当我在开发环境中运行此命令并单击MsgBox上的[否]时,执行将在Debug.Assert行中中断(正如我期望的那样)。
当我/runtime
使用开关运行相同的代码(使用完整版的MS Access 2002)时,我仍然看到MsgBox,但是单击[否]不会停止程序执行。似乎VBA执行了该行,但忽略了结果。这不足为奇,但这是不幸的。
我希望Access可以完全跳过Debug.Assert行。这意味着必须注意不要使用会损害性能的Debug.Assert行,例如:
Debug.Assert DCount("*", "SomeHugeTable", "NonIndexedField='prepare to wait!'") = 0
此行为记录在某处吗?Access中的官方文档似乎是从VB6逐字记录的:
断言调用仅在开发环境中起作用。将模块编译为可执行文件时,将忽略Debug对象上的方法调用。
显然,MS Access应用程序无法编译为可执行文件。是否有比以下解决方法更好的替代方法?
Private Sub Form_Load()
If Not SysCmd(acSysCmdRuntime) Then Debug.Assert UserOK() 'check if Runtime
End Sub
Function UserOK() As Boolean
UserOK = MsgBox("Is everything OK?", vbYesNo, "Test Debug.Assert") = vbYes
End Function
我不知道它是否对您的特定用例更好,但是如果您希望在与应用程序无关的VBA代码中做到这一点,那么还有另一种更好的选择。VBA具有条件编译。可以在模块级别声明条件复杂常量,但是在这种情况下,最好在项目级别声明它。
在菜单栏上,单击Tools>> ,然后在“条件编译参数:”字段中Project Properties键入a DEBUGMODE = 1
。(请注意:DEBUG
由于它是关键字,因此无法使用。)
现在,您可以将所有Debug.Assert()
语句包装在这样的代码中。
#If DEBUGMODE Then
Debug.Assert False
#End If
准备好部署项目时,只需返回“项目属性”对话框并将参数更改为即可DEBUGMODE = 0
。
附加信息:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句