这可能是个微不足道的问题,不过其他人也应该遇到过。在Notes客户端用LotusScript的Print语句输出信息到状态栏时,如果多次调用传入的参数实际相同,状态栏只会显示该信息一次。例如:
Print "a"
Print "a"
Print "a"
不会输出三行a,而只有一行。如果作为参数的变量内容相同,多次调用也只会输出一次。例如:
Print view.Toplevelentrycount
Print view.Toplevelentrycount
Print view.Toplevelentrycount
你或许会问,即使这有些不正常,也没什么妨碍,重复输出有什么意义呢?原因如下。在客户端应用程序中,这些对Print的调用都是为了在程序运行时给用户(不论是普通用户还是开发者人员)信息和反馈。Print重复的静态信息的用例会出现在报告事件和处理进度时,例如在批量审批流程、处理附件、查找特定记录等等时,可以在发生或处理完一个事件后,调用这样的语句:Print"A purchase workflow is reviewed.",Print "A XXX record is found."。以上情况还可以通过在输出的信息中添加序列号来解决。而受这种输出丢失影响更大的则是Print的参数为变量的情况。尤其是在调试程序时,往往会在代码的不同处Print同一变量,以理解某些语句的效果或弄清错误的原因。这时应该的多行输出变为一行,令人困扰。当然可以人为添加一些注释使得每次输出都有差别,但很麻烦。
Print只在客户端运行的代码中,也就是输出到客户端状态栏时,有这种行为。包含它的代码运行在服务器端时,按触发方式或者输出到服务器控制台,或者返回给浏览器,都没有这个问题。所以这是Print语句的特性,抑或是Notes客户机状态栏的问题,似乎更有可能是后者。
这种行为是不是bug?或者是出于某些限制或考量有意设计如此?非计算机科班出身的我,想不出来,在网上也没有查到。不过我印象中Firefox的Firebug插件的控制台也曾有同样行为,用console.log()方法输出重复信息时,只会显示一条。后来有了改进,在输出信息的左边会在括号里标注重复输出的次数,例如(5)Show me again.
剩下的就是如何应对,即workaround。
首先容易想到的就是写一个函数包装Print,在实际要输出的信息前附上当前时间。除却我们的目的,显示输出信息的时间本身也是有益的。遗憾的是LotusScript里的日期时间类型Variant只精确到秒,如果重复信息的输出是在同一秒内,问题依旧。LotusScript可获得的最精确的当前时间是Timer函数的返回值,精确到百分之一秒。于是我们可以写出如下函数:
Public Function PrintMsg(msg As Variant)
Dim strTime As String
strTime=Format(Now, "hh:mm:ss")
Dim hs As Long
hs=Timer Mod 100
strTime=strTime & ":" & hs
Print(strTime & " - " & msg)
End Function
但在应用