Brian Moore wrote about the problem with users thinking Notes applications are slow, due to no visible feedback:
“People seem to be totally happy at letting something take bleeding ages just so long as there is a little moving object to distract them from the clock.”
This is very true, and I addressed this in one of my applications a while back by implementing a progress bar.
Suddenly, when the users got feedback on what was happening, all complaints about it being slow stopped, despite it taking the same amount of time…
I built a progress bar class. Here it is, as well as a small code sample showing how to call it. Note that this is a Win32 only solution.
Option Public
Option Declare
' ***** Declarations for (undocumented) progress bar in Notes *****
Private Const NPB_TWOLINE% = 1
Private Const NPB_STATUSBAR% = 32
Declare Private Function NEMProgressBegin Lib "nnotesws.dll" ( Byval wFlags As Integer ) As Long
Declare Private Sub NEMProgressDeltaPos Lib "nnotesws.dll" ( Byval hwnd As Long, Byval dwIncrement As Long )
Declare Private Sub NEMProgressEnd Lib "nnotesws.dll" ( Byval hwnd As Long )
Declare Private Sub NEMProgressSetBarPos Lib "nnotesws.dll" ( Byval hwnd As Long, Byval dwPos As Long)
Declare Private Sub NEMProgressSetBarRange Lib "nnotesws.dll" ( Byval hwnd As Long, Byval dwMax As Long )
Declare Private Sub NEMProgressSetText Lib "nnotesws.dll" ( Byval hwnd As Long, Byval pcszLine1 As String, Byval pcszLine2 As String )
Class ProgressBar
Private hidden As Integer
Private hwnd As Long
Private value As Long
Private title As String
Private textline1 As String
Private textline2 As String
Private maxvalue As Long
Public Sub New(range As Long, initialtitle As String)
Dim session As New NotesSession
maxvalue = Clng(range)
title = initialtitle
textline1 = ""
textline2 = ""
If session.IsOnServer Then ' Check if code is running on server (scheduled agent)
hidden=True
Else
hidden=False
End If
If hidden = True Then
Exit Sub
End If
hwnd = NEMProgressBegin(NPB_TWOLINE)
Call SetRange(maxvalue)
NemProgressSetText hwnd, title, textline1 & Chr$(13) & textline2
End Sub
Sub Increase()
If hidden = True Then
Exit Sub
End If
If hwnd <> 0 Then
If value < maxvalue Then
value = value + 1
NEMProgressSetBarPos hwnd, value
End If
End If
End Sub
Sub Decrease()
If hidden = True Then
Exit Sub
End If
If hwnd <> 0 Then
If value > 0 Then
value = value - 1
NEMProgressSetBarPos hwnd, value
End If
End If
End Sub
Sub Close
If hidden = True Then
Exit Sub
End If
If hwnd <> 0 Then
NEMProgressEnd hwnd
hwnd = 0
title = ""
value = 0
End If
End Sub
Sub SetRange(value As Long)
If hidden = True Then
Exit Sub
End If
If hwnd <> 0 Then
maxvalue = value
NEMProgressSetBarRange hwnd, maxvalue
End If
End Sub
Sub SetValue(value As Long)
If hidden = True Then
Exit Sub
End If
If hwnd <> 0 Then
NEMProgressSetBarPos hwnd, value
End If
End Sub
Sub SetText(message As String)
If textline2="" Then
Call PrintText()
End If
If hidden = True Then
Exit Sub
End If
If hwnd <> 0 Then
textline1 = message
NEMProgressSetText hwnd, title, textline1 & Chr$(13) & textline2
End If
End Sub
Sub SetText2(message As String)
Call PrintText()
If hidden = True Then
Exit Sub
End If
If hwnd <> 0 Then
textline2 = message
NEMProgressSetText hwnd, title, textline1 & Chr$(13) & textline2
End If
End Sub
Function GetText() As String
GetText = textline1
End Function
Function GetText2() As String
GetText2 = textline2
End Function
Sub PrintText()
Dim text As String
If hidden = True Then
text = textline1
If textline2 <> "" Then
text = text & " - " & textline2
End If
Print text
End If
End Sub
Function Show() As String
hidden = False
hwnd = NEMProgressBegin(NPB_TWOLINE)
Call SetRange(maxvalue)
NemProgressSetText hwnd, title, textline1 & Chr$(13) & textline2
End Function
Function Hide() As String
hidden = True
If hwnd <> 0 Then
NEMProgressEnd hwnd
hwnd = 0
End If
End Function
End Class
Below is a snippet of sample code, showing how it can be implemented. Enjoy!
units = GetNumberOfUnits()
Set pbar = New ProgressBar(CLng(units+1),"Loading data From backend server…")
Call pbar.Show()
For i = 1 To units
Call pbar.Increase()
Call pbar.SetText("Loading coverage For unit " & i & "…")
Set vehicle = New CoverageData(i) ' Get vehicle coverage
Call pbar.SetText2(vehicle.year & " " & FullTrim(vehicle.name) & " – Coverage " & vehicle.cvgcode)
Next
Call pbar.Increase()
Call pbar.SetText("Finishing processing.")
Call pbar.SetText2("Please wait…")
' Do some more stuff here
Call pbar.Close()

Pingback: Lotus Script Multi-thread Message Box [SOLVED] – Wanted Solution