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.478 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. |
sevZIP40 Pro DLL Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 TOP Entwickler-Paket TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
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. |