Dassis alles:
Das setzt voraus, das man ein Form als SplashScreen eingestellt hat, welches eine Progressbar und ein Label hat.

Einstellen tut man den Splash in den Projekteigenschaften:

zwei Hinweise:
Zum Code:
Problem ist, im frmMain_Load() einen Zugriff auf den Splash zu bekommen. Mit Zugriff ist Zugriff gemeint, also es soll kein eingener Splash erstellt werden, sondern Zugriff auf den Splash, den das Anwendungsframework parallel gestartet hat oder zu starten im Begriff ist.
Lösung: Der Splash wird aus der Application.OpenForms-Auflistung geholt.
Problem: möglicherweise ist er da noch gar nicht drin - das weiß man nicht, weil die Threads laufen parallel.
Also wird immer, wenn eine Meldung abzusetzen ist, gecheckt, ob _Splash verfügbar ist, und wenn nicht, wird versucht, ihn aus der OpenForms-Auflistung rauszuholen. Scheitert der Versuch, kann halt nix gemeldet werden - gelingt er, wird die Meldung abgesetzt, via .BeginInvoke().
Die Methode, wie und was gemeldet wird, ist hier in einer anonymen Sub notiert (zeilen #6 - #10): da wird ein Progressbar-Value gesetzt, und ein Label-Text - man könnte auch alles mögliche annere verzapfen.
VB.NET-Quellcode
- Public Class frmMain
- Private _Splash As frmSplash
- Private Sub frmMain_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
- Dim splashMessage As Action(Of Integer) = _
- Sub(n)
- _Splash.ProgressBar1.Value = n
- _Splash.Label1.Text = String.Format("zu {0}% ausgeschlafen", n)
- End Sub
- For i = 10 To 100 Step 10
- Threading.Thread.Sleep(300) 'Simulation einer zeitaufwändigen Berechnung
- If _Splash Is Nothing Then
- _Splash = Application.OpenForms.OfType(Of frmSplash).FirstOrDefault
- If _Splash Is Nothing Then Continue For
- End If
- _Splash.BeginInvoke(splashMessage, i)
- Next
- End Sub
- End Class
Das setzt voraus, das man ein Form als SplashScreen eingestellt hat, welches eine Progressbar und ein Label hat.
Einstellen tut man den Splash in den Projekteigenschaften:
zwei Hinweise:
- bitte keine Dummi-Splashes erstellen - weil das "cool" ist.
Ein Proggi, was einen Splash anzeigt, ist tendenziel schlecht, denn es lädt zu langsam. Dieser Mißstand ist zunächstmal zu beheben, und wenn einem garnix mehr einfällt, um den Startup zu beschleunigen, greift man schweren Herzens zur Splash-Screen-Krücke.
Startet es hingegen schnell, so freut sich der Programmierer, und freut sich der User, weiler anfangen kann, ohne einen dämlichen Splash abwarten zu müssen
- Die Einstellung über die Projekteigenschaften ist sauber, fehlerfrei, resourcen- und leistungs-optimiert:
Die Cpu-Leistung geht zunächst in den Aufbau des Splashes, und danach steht die Rechenleistung dem MainProgramm zur Verfügung. Der Splashscreen läuft in einem NebenThread, sodasser vom (voll ausgelasteten) Main-Thread nicht blockiert wird.
Zum Code:
Problem ist, im frmMain_Load() einen Zugriff auf den Splash zu bekommen. Mit Zugriff ist Zugriff gemeint, also es soll kein eingener Splash erstellt werden, sondern Zugriff auf den Splash, den das Anwendungsframework parallel gestartet hat oder zu starten im Begriff ist.
Lösung: Der Splash wird aus der Application.OpenForms-Auflistung geholt.
Problem: möglicherweise ist er da noch gar nicht drin - das weiß man nicht, weil die Threads laufen parallel.
Also wird immer, wenn eine Meldung abzusetzen ist, gecheckt, ob _Splash verfügbar ist, und wenn nicht, wird versucht, ihn aus der OpenForms-Auflistung rauszuholen. Scheitert der Versuch, kann halt nix gemeldet werden - gelingt er, wird die Meldung abgesetzt, via .BeginInvoke().
Die Methode, wie und was gemeldet wird, ist hier in einer anonymen Sub notiert (zeilen #6 - #10): da wird ein Progressbar-Value gesetzt, und ein Label-Text - man könnte auch alles mögliche annere verzapfen.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()