Hin und wieder wäre es wünschenswert, während eines längeren Programm-Ablaufes den Anwender über den Fortschritt der Prozedur auf dem Laufenden zu halten. Dies kann einfach über ein Objekt der Klasse Progress geschehen (siehe hierzu auch «Progressive Abschussmechanismen»). Doch dieses stellt lediglich einen Balken dar, welcher den Fortschritt grob anzeigt. Manchmal wären aber numerische Angaben («Datensatz x von y») und vergangene Zeit etc. zusammen mit einer Möglichkeit, den Prozess zu unterbrechen, sinnvoll.
Es stehen hier mehrere Möglichkeiten mit eigenen Vor- und Nachteil zur Wahl (siehe auch Abschnitt «Modale vs. nicht modale Dialoge»):
in einem Dokument eingebettetes Makro: empfehlenswert, wenn während der Ausführung keine SO-Dokumente geöffnet, bearbeitet und geschlossen werden, da es dann dem Anwender möglich ist, während der Programmausführung in anderen Dokumenten weiter zu arbeiten.
in einem eigenen Dialog-Fenster: soll der Anwender möglichst keinen Zugriff auf das SO haben, so ist dies die richtige Methode. Dies kann durchaus sinnvoll sein, wenn das Makro laufend Dateien öffnet, bearbeitet etc. Hier könnte ein Benutzereingriff fatale Folgen haben.
Beispiele für beide Methoden sind in progress.sdw enthalten.
Wie erwähnt kann es manchmal von Vorteil sein, wenn der Anwender
während dem Abarbeiten eines Makros im SO weiterarbeiten kann.
Da Dialoge stets modal sind, also keine anderen Tätigkeiten
erlauben, kann man auch einen «Dialog» in ein SW-Dokument
einbetten. Ein paar Kontrollfelder zusammen mit wenigen Zeilen
StarBasic-Code erlauben bereits ein Feedback in einem solchen
Dokument.
Da solche Prozesse vielfach in einer Schleife ablaufen, könnte
ein Grundgerüst etwa wie folgt aussehen (wobei Timer
und Counter die in nebenstehender Abbildungen sichtbaren
Zähler darstellen):
...
For Counter% = 1 To MaxCount&
Timer.Caption = TimeElapsed(False)
Counter.Caption = Counter%
If bCancelled Then
Exit For
End If
Next
...
Die Variable bCancelled stellt ein globales Flag dar, welches auf True gesetzt wird, sobald der Abbrechen-Knopf gedrückt wird. Hierfür wird folgende Routine mit dem OnClick-Ereignis dieses Knopfes verbunden:
Sub Cancel_Clicked bCancelled = True End Sub
Soll der Anwender auch über den Fortschritt auf dem Laufenden gehalten werden, wenn er in anderen Dokumenten weiter arbeitet, so empfiehlt sich der Einsatz eines Progress-Objektes. Nach dessen Initialisierung muss nur noch eine Zeile in obige Schleife eingefügt werden, welche den Statusbalken aktualisiert:
... myProgress.Value = Counter% ...
Die Fortschritts-Anzeige im Dialog ist die sicherere Variante, wenn das SO während der Programmausführung für andere Aufgaben gesperrt sein soll. Nach dem Entwurf des entsprechenden Dialoges stellt sich bald einmal die Frage, wie denn nun die Anzeige stattfinden soll: aus einem laufenden Prozess heraus kann kein Dialog aufgerufen werden, währenddem er weiter laufen soll. Der Prozess wird erst weiter ausgeführt, wenn der Dialog geschlossen wird. Also muss der lange Prozess aus dem Dialog heraus gestartet werden. Hierfür kann gut ein kleiner, mehrseitiger Dialog verwendet werden, welcher vielleicht auf der ersten Seite noch auf die möglicherweise lange Laufzeit aufmerksam macht und dann auf Knopfdruck startet und die nächste Seite mit den Informationen anzeigt. Die obige Schleif muss dann lediglich um die korrekte Zuweisung der Werte korrigiert werden. Aus
Counter.Caption = Counter%
wird beispielsweise
myDialog.Counter.Caption = Counter%
Natürlich lässt sich der Dialog auch beliebig ausbauen. Der folgende Screenshot stammt aus dem Hyperlink-AutoCheck und zeigt im rechten Teil («Statistik») diverse Zahlen zur Aktivität an, während in der Liste links alle gefundenen Hyperlinks aufgelistet werden.
