Immer wenn eine Aktion etwas länger dauert, z.B. Programmstart, Datenbank-Rechereche, ListBoxen füllen usw., sollte man den Anwender irgendwie "ablenken". Meist nimmt man hierfür eine ProgressBar, die den aktuellen Fortschritt anzeigt. Das klappt auch immer dann, wenn im Vornherein feststeht, wie lange die Aktion dauert bzw. wenn man im Vornherein die Min- und Max-Eigenschaften entsprechend kennt und über die Value-Eigenschaft dann den Fortschritt aktualisiert. Was aber, wenn man nicht weiß, wie lange die Aktion dauert oder wenn man den Fortschritt nicht "berechnen" kann? Beispiel:
Public Sub Main() Load frmStatus frmStatus.ProgressBar1.Max = 3 ' Globale Variablen deklarieren frmStatus.ProgressBar1.Value = 1 ... ' Datenbank öffnen frmStatus.ProgressBar1.Value = 2 ... ' MainForm laden und anzeigen frmStatus.ProgressBar1.Value = 3 Load frmMain frmMain.Show Unload frmStatus End Sub Sind auf der Mainform viele Controls enthalten, dauert der Ladevorgang entsprechend lange, was dem Anwender über die ProgressBar aber nicht mitgeteilt werden kann In diesem Fall würde sich eine WaitBar vielleicht besser machen, d.h. statt einen echten Fortschritt zeigt man einen Balken an, der sich von links nach rechts bewegt und wieder zurück - solange, bis die einzelnen Aktionen abgeschlossen sind. Nachfolgender Tipp stellt Ihnen eine universelle WaitBar zur Verfügung. Sie brauchen hierfür lediglich eine Form mit einer PictureBox als Container-Control. Mehr nicht Bei dem Balken, der im Container-Control (PictureBox) von links nach rechts "läuft", handelt es sich um ein ganz normales "Label"-Control, das zur Laufzeit erstellt wird und sich autom. der Größe der PictureBox (Höhe) anpasst. Damit sich der Balken auch bewegen kann, brauchen wir einen Timer. Hierfür verwenden wir nicht das Timer-Control von VB, sondern den API-Timer. Aus diesem Grund muss der Code auch in ein Modul: Option Explicit ' Benötigte API's für die Timer-Steuerung Private Declare Function SetTimer Lib "user32" ( _ ByVal hWnd As Long, _ ByVal nIDEvent As Long, _ ByVal uElapse As Long, _ ByVal lpTimer As Long) As Long Private Declare Function KillTimer Lib "user32" ( _ ByVal hWnd As Long, _ ByVal nIDEvent As Long) As Long Private Const MY_NID = 88 ' Legt fest, in welchen Schritten der ' Balken bewegt werden soll Private Const nStep = 3 Private m_lblControl As Control ' WaitBar erstellen Public Sub InitWaitBar(oForm As Form, _ picContainer As Control, _ Optional ByVal nBackColor As OLE_COLOR = &HFFC0C0) ' Label-Control nur erstellen, falls ' nicht schon erstellt. Dim bExists As Boolean Dim oControl As Control For Each oControl In oForm.Controls If oControl.Name = "lblWaitBar" Then Set m_lblControl = oControl bExists = True: Exit For End If Next ' ScaleMode auf Pixel setzen picContainer.ScaleMode = vbPixels If Not bExists Then ' Label erstellen Set m_lblControl = oForm.Controls.Add("VB.Label", _ "lblWaitBar", picContainer) End If m_lblControl.Caption = "" m_lblControl.BackColor = nBackColor End Sub ' WaitBar starten Public Sub ShowWaitBar(ByVal hWnd As Long, _ Optional ByVal nInterval = 15) Dim nResult As Long If Not m_lblControl Is Nothing Then With m_lblControl ' Label zunächst ganz nach links setzen .Move -.Width, 0, .Width, .Container.ScaleHeight .Visible = True ' Timer starten nResult = SetTimer(hWnd, MY_NID, nInterval, _ AddressOf WaitBar_TimerEvent) End With End If End Sub ' Timer-Event! Private Sub WaitBar_TimerEvent( _ ByVal hwnd As Long, _ ByVal uMsg As Long, _ ByVal idEvent As Long, _ ByVal dwTime As Long) Dim nLeft As Single With m_lblControl ' aktuelle Position nLeft = .Left If .Tag <> "back" Then ' Vorwärts! (nach rechts bewegen) nLeft = .Left + nStep If nLeft + .Width > .Container.ScaleWidth Then .Tag = "back" nLeft = .Container.ScaleWidth - .Width End If Else ' Rückwärts! (nach links bewegen) nLeft = .Left - nStep If nLeft < 0 Then .Tag = "": nLeft = 0 End If ' Label positionieren .Left = nLeft End With End Sub ' WaitBar stoppen Public Sub StopWaitBar(ByVal hWnd As Long) ' Timer stoppen KillTimer hWnd, MY_NID ' Label wieder unsichtbar machen If Not m_lblControl Is Nothing Then m_lblControl.Visible = False End If End Sub Beispiel: Private Sub Form_Load() ' WaitBar initialisieren InitWaitBar Me, picWaitBar End Sub Private Sub cmdStart_Click() ' WaitBar starten ShowWaitBar Me.hWnd, 25 End Sub Private Sub cmdStop_Click() ' WaitBar ausblenden StopWaitBar Me.hWnd End Sub Dieser Tipp wurde bereits 29.609 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
vb@rchiv CD Vol.6 Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats Juli 2024 Dieter Otter Beliebige Zeichen am Anfang und Ende eines Strings entfernen Mit der Trim-Funktion lassen sich nicht nur Leerzeichen, sondern bei Bedarf auch beliebige Zeichen entfernen. sevAniGif (VB/VBA) Anzeigen von animierten GIF-Dateien Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |