Splash-Screen mit Status-Meldungen

    • VB.NET

      Splash-Screen mit Status-Meldungen

      Dassis alles:

      VB.NET-Quellcode

      1. Public Class frmMain
      2. Private _Splash As frmSplash
      3. Private Sub frmMain_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
      4. Dim splashMessage As Action(Of Integer) = _
      5. Sub(n)
      6. _Splash.ProgressBar1.Value = n
      7. _Splash.Label1.Text = String.Format("zu {0}% ausgeschlafen", n)
      8. End Sub
      9. For i = 10 To 100 Step 10
      10. Threading.Thread.Sleep(300) 'Simulation einer zeitaufwändigen Berechnung
      11. If _Splash Is Nothing Then
      12. _Splash = Application.OpenForms.OfType(Of frmSplash).FirstOrDefault
      13. If _Splash Is Nothing Then Continue For
      14. End If
      15. _Splash.BeginInvoke(splashMessage, i)
      16. Next
      17. End Sub
      18. 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 :thumbsup:

      • 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.
      Dateien

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()