12.15 Fortschrittsbalken (ProgressBar)
Manchmal führen Anwendungen eine länger dauernde Aufgabe durch, z. B. das Kopieren von Dateien, das Herunterladen von Dateien aus dem Internet oder eine länger dauernde Rechenoperation – Vorgänge, die dem Anwender Geduld abverlangen.
Ein Programm, das eine länger andauernde Aufgabe ausführt, sollte den Benutzer davon in Kenntnis setzen, damit dieser nicht denkt, die Anwendung reagiere nicht mehr. Man kann das dadurch erreichen, dass man für die Dauer der Ausführung den Mauszeiger als Sanduhr darstellt. Das ist ein erster Ansatz, um auf die Hintergrundtätigkeit der Anwendung aufmerksam zu machen. Wie lange diese andauern wird, kann der Anwender jedoch nicht im Geringsten abschätzen. Jetzt schlägt die Stunde des ProgressBar-Steuerelements, das dem Anwender über einen Fortschrittsbalken den Stand der Operation rückmeldet.
Die Programmierung dieses Steuerelements ähnelt den zuvor behandelten Bildlaufleisten. Zur Entwicklungszeit legen Sie die Eigenschaften Maximum und Minimum fest, zur Laufzeit ermitteln Sie aus dem aktuellen Stand der Operation den Wert der Eigenschaft Value. Entweder weisen Sie der Eigenschaft einen Wert zu oder rufen die Methode PerformStep auf, um die aktuelle Position der Statusanzeige zu erhöhen. Die Schrittweite wird durch die Eigenschaft Step vorgegeben.
Mit der Eigenschaft Style können Sie den Anzeigestil des Fortschrittsbalkens festlegen. Dazu gibt es drei Einstellmöglichkeiten, die Sie der Tabelle 12.16 entnehmen können.
Konstante | Anzeige im Steuerelement |
Blocks |
Steigende Anzahl unterteilter Blöcke |
Continuous |
Ein durchgehender Balken |
Marquee |
Blöcke, die wie eine Laufschrift den Anzeigebereich durchlaufen |
Für die Einstellung ProgressBarStyle.Marquee kontrolliert die Eigenschaft MarqueeAnimationSpeed, wie schnell die Laufbalken durch den Anzeigebereich laufen. Die Angabe erfolgt in Millisekunden.
Beispielprogramm
Im folgenden Beispielprogramm wird eine Datei geöffnet und deren Inhalt in einer Textbox ausgegeben. Da der Ladevorgang eine längere Zeit in Anspruch nimmt, wird der Ladestatus in einem ProgressBar-Steuerelement angezeigt (siehe Abbildung 12.31).
Abbildung 12.31 Formular des Beispiels »Fortschritt«
Zu Demonstrationszwecken erzeugen wir im Folgenden eine Datei, während die Form geladen wird. Dabei wird in einer Schleife 20001-mal ein Zeichen in die Datei geschrieben, jeweils ein Buchstabe des Alphabets.
'...\WinControls\Dialoge\Fortschritt.vb |
Public Class Fortschritt Private file As String = IO.Path.Combine( _ Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), _ "TestFortschritt.txt") Private Sub Laden(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.Load ' Datei erzeugen und mit Zeichen füllen Dim fs As IO.FileStream = IO.File.Open(file, IO.FileMode.Create) For i As Integer = 0 To 20000 : fs.WriteByte((i Mod 26) + 97) : Next fs.Close() End Sub Private Sub Aktion(ByVal sender As Object, ByVal e As EventArgs) _ Handles Füllen.Click Me.Cursor = Cursors.WaitCursor Textfenster.Clear() Textfenster.Refresh() ' Fortschrittsbalken einstellen Fortschrittsbalken.Maximum = (New IO.FileInfo(file)).Length Fortschrittsbalken.Step = 1 Fortschrittsbalken.Value = 0 ' Datei einlesen und Fortschrittsbalken aktualisieren Dim text As String = "" Dim fs As IO.FileStream = IO.File.Open(file, IO.FileMode.Open) While True Dim var As Integer = fs.ReadByte() If var = –1 Then Exit While 'Dateiende text += Convert.ToChar(var) Fortschrittsbalken.PerformStep() End While fs.Close() Textfenster.Text = text Me.Cursor = Cursors.Default End Sub Private Sub Ende(ByVal sender As Object, ByVal e As FormClosedEventArgs) _ Handles MyBase.FormClosed IO.File.Delete(file) End Sub End Class
Im Ereignishandler des Click-Ereignisses der Schaltfläche wird – nachdem ein Wartecursor gesetzt und die Textbox mit einem Objekt von Typ FileInfo geleert wurde – die Größe der einzulesenden Datei ermittelt, um die Eigenschaft Maximum des ProgressBar-Steuerelements zu setzen. Als Schrittweite des Fortschrittsbalkens wird der Wert 1 festgelegt.
Zum Einlesen wird ein Objekt vom Typ FileStream verwendet, das in einer Schleife die Datei byteweise mit ReadByte einliest und nach jedem gelesenen Byte den Fortschrittsbalken aktualisiert. Sind alle Daten eingelesen, wird die Schleife beendet, der Dateistrom geschlossen und der Inhalt der Datei, der sich in der Variablen text angesammelt hat, in der Textbox angezeigt. Ich habe bewusst auf einen StringBuilder verzichtet, um das Programm etwas auszubremsen. Zum Schluss wird der Mauscursor wiederhergestellt.
Beim Schließen der Form wird die erstellte Datei gelöscht.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.