zweite Windows-Form als Splashscreen lädt eine Elemente nicht

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Cheffboss.

    zweite Windows-Form als Splashscreen lädt eine Elemente nicht

    Hallo,

    ich habe stell mich gerade blöd an.
    Da meine Anwendung etwas länger läd, will ich einen Splashscreen anzeigen.

    Das habe ich vom Prinzip so gelöst:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. Form2.Show()
    3. 'mach was
    4. Form2.ActiveForm.Close()
    5. End Sub


    Das Problem besteht darin, dass der Inhalt von Form2 (Picturebox oder Label) nicht geladen wird.

    Wenn ich

    VB.NET-Quellcode

    1. Form2.ActiveForm.Close()
    weglasse, dann wird Form2 geladen, sobald Form1 fertig geladen ist.
    Was mache ich falsch?
    @Bot-Like Sieh Dir mal an, wie Dialoge instanziiert und aufgerufen werden:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Und einen Start-SplashScreen kannst Du in den Projekt-Eigenschaften festlegen:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die zweite Form muss in ihrem eigenen Thread laufen.
    Ich habe leider kein VB Beispiel für dich, hier dennoch ein wenig C# Code der einen "Ladebildschirm" ermöglicht.

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Windows.Forms;
    3. using System.Threading;
    4. namespace Your.Project
    5. {
    6. public partial class FrmLoadingScreen : Form
    7. {
    8. private static FrmLoadingScreen _frmInternal;
    9. public static void ShowLoadingScreen()
    10. {
    11. if (_frmInternal != null) {
    12. return;
    13. }
    14. Thread thread = new Thread(new ThreadStart(FrmLoadingScreen.ShowFormInternal));
    15. thread.IsBackground = true;
    16. thread.SetApartmentState(ApartmentState.STA);
    17. thread.Start();
    18. }
    19. private static void ShowFormInternal()
    20. {
    21. Application.UseWaitCursor = true;
    22. _frmInternal = new FrmLoadingScreen();
    23. Application.Run(_frmInternal);
    24. }
    25. private delegate void CloseDelegate();
    26. public static void CloseForm()
    27. {
    28. Application.UseWaitCursor = false;
    29. _frmInternal?.Invoke(new CloseDelegate(FrmLoadingScreen.CloseFormInternal));
    30. }
    31. private static void CloseFormInternal()
    32. {
    33. _frmInternal.Close();
    34. _frmInternal = null;
    35. }
    36. public static void TryActivate()
    37. {
    38. if (_frmInternal == null)
    39. {
    40. return;
    41. }
    42. _frmInternal.Activate();
    43. }
    44. public new void Activate()
    45. {
    46. if (InvokeRequired)
    47. {
    48. Invoke(new Action(Activate));
    49. }
    50. else
    51. {
    52. base.Activate();
    53. }
    54. }
    55. public FrmLoadingScreen(int maxValue)
    56. {
    57. InitializeComponent();
    58. }
    59. }
    60. }



    In deiner Haupt-Form muss der Aufruf dann einfach so erfolgen:
    FrmLoadingScreen.ShowLoadingScreen();

    ABER mit diesem Code musst du auch nach dem Laden der Daten in der Haupt Form den Ladebildschirm schließen.
    Hier beispiel wie dass in einem Form.Shown() event funktioniert.
    Spoiler anzeigen

    C#-Quellcode

    1. private void Window_Shown(object sender, EventArgs e)
    2. {
    3. FrmLoadingScreen.CloseForm();
    4. }


    @RodFromGermany
    Ich habe eine Frage an dich. ?(
    Wenn man ein Begrüßungsbildschirm eingestellt hat, lädt es dann die Hauptform im Hintergrund, damit man diese schneller gestartet wird?
    Oder welchen Sinn hat es sonst noch?
    Visual Basic.NET 8o
    MS-SQL
    8o

    Cheffboss schrieb:

    Frage an dich.
    Probiere es aus. ;)
    Mach Dir ein kleines Testprojekt mit nem Splash und ner langwierigen Init-Prozedur in Form1.
    Berichte von Deinen Erfahrungen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Danke.
    Ich hab jetzt mal den einfachen Weg gewählt und die Option in den Projekteigenschaften genutzt. (das kannte ich noch nicht und das war genau das was ich brauche)
    In die Geschichte mit der Instanzierung lese ich mich ein, wenn ich das eines schönen Tages brauche.

    @Cheffboss
    Weil die User sonst 1000 mal auf das Icon Klicken weil sie sich wundern, warum nix los geht.
    Sowas muss immer Schimpansengerecht sein!
    @RodFromGermany
    Ich habe es nun ausprobiert.
    Das Splash wird angezeigt, und wenn die Form1 geladen ist,
    wird diese wieder angezeigt und das Splash-Fenster schließt sich von selbst.
    Wieder etwas neues dazu gelernt!
    :thumbup:
    Visual Basic.NET 8o
    MS-SQL
    8o