vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Oberfläche · Fenster   |   VB-Versionen: VB2005, VB2008, VB201009.03.12
Eine einfache, voll funktionsfähige, asynchrone WaitingForm

Eine WaitingForm, die bei langdauernden Prozessen eine Progressbar in einem separaten Thread im Vordergrund anzeigt

Autor:   Dietrich HerrmannBewertung:  Views:  13.091 
ohne HomepageSystem:  WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Zunächst erstellt man die Form, die als "Waiting-Form" genutzt werden soll. Die Form sollte möglichst folgende Eigenschaftseinstellungen haben:

  • FormBorderstyle = None
  • StartPosition = Manual

Wenn man möchte, dass die Form mit einem DropShadow dargestellt werden soll, dann kann man das mit dem folgenden Code, den man in die FormKlase einfügt, erreichen:

' Define the CS_DROPSHADOW constant
Private Const CS_DROPSHADOW As Integer = 131072
' Override the CreateParams property
Protected Overrides ReadOnly Property CreateParams() As CreateParams
  Get
    Dim cp As CreateParams = MyBase.CreateParams
    cp.ClassStyle = cp.ClassStyle Or CS_DROPSHADOW
    Return cp
  End Get
End Property

Dann platziert man auf der Form ein Progressbar-Control mit den Eigenschaften:

  • Style = Marquee
  • Dock = Fill
  • MarqueeAnimationSpeed = 10

Das sind so zu sagen die vorbereitenden Tätigkeiten.

Damit diese Form als asynchrone WaitingForm angezeigt wird, benötigt man die folgende Klasse 'clsWaitingWindow.vb':

Imports System.Windows.Forms
Imports System.Threading
 
Public Class PleaseWait
  Implements IDisposable
 
  Private waitSplash As Form
  Private waitLocation As Point
 
  ''' <summary>
  ''' Einstellungen beim Erstellen der Waitingform
  ''' </summary>
  ''' <param name="theWaitingForm">Name der zu verwendenden Form</param>
  ''' <param name="x">die linke Position der Waitingform</param>
  ''' <param name="y">die obere Position der Waitingform</param>
  ''' <remarks>Gibt man location nicht explizit als Point an,
  ''' wird die Waitingform auf dem Screen zentriert gezeigt</remarks>
  Public Sub New(ByVal theWaitingForm As Form, _
    Optional ByVal x As Integer = 0, Optional ByVal y As Integer = 0)
 
    waitSplash = theWaitingForm
    waitLocation = New Point(x, y)
    Dim thr As New Thread(New ThreadStart(AddressOf workerThread))
    With thr
      .IsBackground = True
      .SetApartmentState(ApartmentState.STA)
      .Start()
    End With
  End Sub
 
  Public Sub Dispose() Implements IDisposable.Dispose
    waitSplash.Invoke(New MethodInvoker(AddressOf stopThread))
  End Sub
 
  Private Sub stopThread()
    waitSplash.Close()
  End Sub
 
  Private Sub workerThread()
    With waitSplash
      If waitLocation = New Point(0, 0) Then
        .StartPosition = FormStartPosition.CenterScreen
      Else
        .Location = waitLocation
      End If
      .TopMost = True
    End With
    Application.Run(waitSplash)
  End Sub
End Class

Zur Anwendung der Form kann man diesen Code benutzen, wenn der zu erwartend länger dauernde Prozess stattfindet (bspw. Laden von umfangreichen Datenbeständen in DatagridView):

Using New PleaseWait(NameOfWaitingform)
  ' ... hier die langdauernden Abläufe starten
End Using

Dann wird an dieser Stelle die WaitingForm mit der animierten Progressbar im Vordergrund angezeigt. Die Form bleibt solange sichbar, wie der Prozess dauert, dann wird sie wieder ausgeblendet.

Als Position für die Form kann ein individueller Punkt angegeben werden, gibt man keinen an, wird die Form auf dem Bildschirm zentriert angezeigt.



Anzeige

Kauftipp Unser Dauerbrenner!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.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


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.