ProgressBar class for Lotusscript

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()

 

This Post Has One Comment

Leave a Reply