Fortschrittsanzeige mit und ohne Dialog

Einleitung

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»):

Beispiele für beide Methoden sind in progress.sdw enthalten.

Im Dokument

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%
...

Im eigenen Dialog-Fenster

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.



Letzte Änderung: 03.04.98
Copyright ©1998 by Michael Herger