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