Die Fortschrittsanzeige – geduldigeres Warten

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Autor: Christoph Spielmann, Düsseldorf

Gut Ding will Weile haben, denkt sich mancher Programmierer, wenn er bei der Programmierung eines Importvorgangs schon vermutet, dass der spätere Benutzer seines Werks wohl die eine oder andere Tasse Kaffee trinken wird, bis die Daten korrekt in den Tabellen untergebracht sind. Bei länger andauernden Vorgängen ist es sinnvoll, dem Benutzer ehrlich mitzuteilen, dass der Vorgang noch länger dauert. Er wird darauf aufmerksam gemacht, dass etwas passiert, und wartet geduldiger auf den Abschluss der Arbeit.

Die denkbar schlechteste Lösung bei der Abarbeitung länger dauernder Vorgänge ist es, dem Benutzer keine Information über den aktuellen Stand zu geben. Generell sollten alle Vorgänge, die länger als drei Sekunden dauern, entsprechend dokumentiert werden.

Bei sehr langen Vorgängen, die beispielsweise mehrere Minuten dauern, sollte dem Benutzer außerdem die geschätzte Restzeit bis zum Ende angezeigt werden. So kann der Benutzer den Vorgang besser einschätzen und ggf. seine Arbeit darauf einstellen.

Die hier vorgestellte Lösung gibt Ihnen die Möglichkeit, sowohl den prozentualen Fortschritt als auch die noch benötigte Restdauer anzeigen zu lassen. Darüber hinaus können Sie den Vorgang abbrechen oder anhalten.

Bild 1: Die fertige Fortschrittsanzeige

Letzteres ist insbesondere bei sehr langen Importvorgängen sinnvoll, die mehrere Tage dauern und vorzugsweise über Nacht ausgeführt werden sollen.

Tagsüber können Sie den Vorgang anhalten, damit Sie problemlos andere Aufgaben mit Ihrem PC erledigen können. Bild 1 zeigt Ihnen den Aufbau der fertigen Fortschrittsanzeige.

Damit Sie die Fortschrittsanzeige problemlos in Ihre Datenbanken übernehmen können, ist der Aufbau allgemein gehalten. Aus dem gleichen Grund befindet sich der komplette VBA-Programmcode in dem Formularmodul der Fortschrittanzeige, sodass Sie lediglich ein einzelnes Formular in Ihre Datenbank kopieren müssen.

Zum Erstellen der Fortschrittsanzeige gehen Sie wie folgt vor:

  • Legen Sie ein neues, ungebundenes Formular an.
  • Blenden Sie die Navigationsschaltfläche, die Bildlaufleisten, die Min- und Max-Schaltflächen sowie die Schließen-Schaltfläche aus. Die entsprechenden Eigenschaften finden Sie im Eigenschaftenfenster des Formulars.
  • Stellen Sie die Eigenschaften Automatisch zentrieren, PopUp und Gebunden auf den Wert Ja und die Eigenschaft Rahmenart auf den Wert Dialog ein.
  • Innerhalb des Formulars platzieren Sie anschließend ein Rechteck. Verwenden Sie dazu das Rechteck-Werkzeug der Toolbox. Geben Sie dem neuen Steuerelement den Namen recFrame. Anschließend geben Sie dem Rahmen eine weiße Hintergrundfarbe sowie einen vertieften Spezialeffekt. Letzteres stellen Sie mit der gleichnamigen Eigenschaft des Rechtecks ein.

    Bild 2: Die Anordnung der Rechtecke zur Darstellung des prozentualen Fortschritts

    Innerhalb dieses Frames erstellen Sie ein weiteres Rechteck namens recProgressBar. Färben Sie dieses Rechteck blau ein und passen Sie es pixelgenau in den Frame ein. Die Breite sollte hierbei über den kompletten Frame gehen, was der späteren Darstellung von 100% entspricht. Bild 2 zeigt Ihnen den Aufbau des Balkens in der Entwurfsansicht.

    Praxis-Tipp

    Bei der Positionierung helfen Ihnen die Pfeiltasten der Tastatur. Bei gedrückt gehaltener Strg-Taste können Sie das markierte Steuerelement pixelweise verschieben. Die Größe ändern Sie, indem Sie zusätzlich die Umschalttaste drücken.

    Anschließend platzieren Sie mittig auf dem Balken ein Bezeichnungsfeld mit transparentem Hintergrund. Geben Sie dem Steuerelement den Namen lblPercent und richten Sie den Inhalt zentriert aus. Als Text geben Sie lediglich einen Punkt ein. Dieser wird später vom Programmcode durch die Prozentangabe ersetzt.

    Bild 3: Das Formular frmProgressBar in der Entwurfsansicht

    Danach positionieren Sie unterhalb des Balkens noch zwei Bezeichnungsfelder namens lblTime und lblInfo. Beide Steuerelemente sollten ebenfalls einen transparenten Hintergrund haben. Ersteres zeigt später die noch verbleibende Restzeit an. Das zweite Steuerelement dient der Anzeige eines Textes, der den aktuellen Vorgang dokumentiert.

    Abschließend ordnen Sie unterhalb der Bezeichnungsfelder noch zwei Schaltflächen an, die Sie mit Abbrechen und Pause beschriften. Die Namen lauten btnCancel und btnBreak. Daneben setzen Sie noch ein Textfeld namens txtFocus, dessen Höhe und Breite Sie in 0 ändern. Dieses Feld wird dazu benötigt, den Focus von den beiden Schaltflächen wegzubewegen, um diese beispielsweise auszublenden.

    Die Designarbeiten sind damit abgeschlossen. Bild 3 zeigt Ihnen noch einmal das komplette Formular zusammen mit den Formulareigenschaften in der Entwurfsansicht.

    Speichern Sie es abschließend unter dem Namen frmProgressBar.

    Die Steuerung der Fortschrittsanzeige erfolgt mit Hilfe von VBA-Programmcode. Zur Erfassung des Codes wechseln Sie mit Hilfe des Code-Symbols in den VBA-Editor des Klassenmoduls, das mit dem Formular verbunden ist.

    Private Sub SetPercentage(Percent As Integer)
        Me.lblPercent.Caption = CStr(Percent) + "%"
        If Percent < 50 Then
            Me.lblPercent.ForeColor = QBColor(1) ''Blau
        Else
            Me.lblPercent.ForeColor = QBColor(15) ''Weiß
        End If
        Me.recProgressBar.Width = m_InitialBarWidth / 100 _        * Percent
        m_CurrentPercent = Percent
    End Sub

    Quellcode 1

    Private Sub Form_Load()
        m_InitialBarWidth = Me.recProgressBar.Width
    End Sub

    Quellcode 2

    Private Sub SetTime(Percent As Integer)
        Dim SecondsForOnePercent As Double
        If Percent = 0 Then
            Me.lblTime.Caption = "Berechne Restzeit"
        Else
            SecondsForOnePercent = (Timer - m_StartTimer) / (Percent - m_RestartPercent)
            
            Me.lblTime.Caption = "Restdauer: " + SecondsToTime(Fix((100 - Percent) * SecondsForOnePercent) + 1)
        End If
    End Sub

    Quellcode 3

    Im Kopf platzieren Sie die folgenden Deklarationsanweisungen:

    Private m_InitialBarWidth As Long
    Private m_StartTimer As Long
    Private m_MaxSteps As Long
    Private m_Cancel As Boolean
    Private m_RestartPercent As Integer
    Private m_CurrentPercent As Integer

    Den Zweck dieser Variablen lernen Sie später noch kennen.

    Die erste Prozedur SetPercentage (s. Quellcode 1) hat die Aufgabe, die prozentuale Darstellung des Balkens zu steuern. Hierzu wird die Breite des blauen Rechtecks entsprechend der aktuellen Prozentzahl variiert:

    Zuerst wird die Prozentzahl in das entsprechende Bezeichnungsfeld lblPercent geschrieben. Sofern der Fortschritt noch unter 50% liegt, wird der Text schwarz dargestellt.

    Oberhalb von 50% erfolgt eine blaue Darstellung. So hebt sich der Text optimal vom Hintergrund ab.

    Im letzten Teil erfolgt schließlich die Berechnung der Balkenbreite. Hierzu ist es erforderlich, die maximale Breite des Balkens zu kennen, damit die prozentuale Darstellung korrekt erfolgen kann.

    Diese liest die Prozedur aus der privaten Variable InitialBarWidth aus, die im Load-Ereignis des Klassenmoduls gesetzt wird (s. Quellcode 2).

    Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

    Testzugang

    eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

    diesen und alle anderen Artikel mit dem Jahresabo

    Schreibe einen Kommentar