Dialogaufruf und SplashScreen - Befehlsabfolge bei Programmstart

  • VB.NET

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

    Dialogaufruf und SplashScreen - Befehlsabfolge bei Programmstart

    Mein Programm zeigt bei Start die Mainform samt Datenbanktabelle an und prüft dann, ob Einträge überaltert sind - in dem Fall wird ein Fenster/Dialog geöffnet, das eine vereinfachte Liste der betroffenen Einträge anzeigt:

    VB.NET-Quellcode

    1. Public Sub Form_DataList_Refresh(sender As Object, e As EventArgs) Handles Me.Activated
    2. ' Intitialisiert das Startfenster bei Programmstart und bei Aktivierung nach Update der Datenbank
    3. ' FormUpdate und NewStart als globale Variablen definiert - Startwert = True
    4. Dim datOverDue As New DataTable
    5. Me.WindowState = FormWindowState.Maximized
    6. Assign_PreSets()
    7. ' Wenn Datenbank aktualisiert wurde wird das Datagridview geleert und aktualisiert
    8. If FormUpdate Then
    9. Data_ForecastList.Columns.Clear()
    10. If SQL_Connect() Then
    11. Create_ForecastList()
    12. Else
    13. Form_InputBox.ShowDialog()
    14. End If
    15. Check_OrderDate(datOverDue)
    16. FormUpdate = False
    17. End If
    18. ' Nur bei Neustart die Liste der überalterten Einträge aufrufen
    19. If NewStart Then
    20. NewStart = False
    21. If datOverDue.Rows.Count > 0 Then
    22. Dim frm As Form_OverdueEntries = New Form_OverdueEntries(datOverDue)
    23. frm.ShowDialog()
    24. End If
    25. End If
    26. End Sub


    Ich habe dabei zwei Probleme:
    1. Ich möchte die Mainform im Windows State = Maximized starten - wenn ich das im Code bei der Aktivierung aufrufe, wird ordentlich zunächst die Hauptform mitsamt Labels und Tabelle geladen und dann steht der Dialog im Vordergrund. Wenn die Mainform dann aber nach Aufruf anderer Fenster (z.B. Datensatz erstellen oder editieren) wieder aktiviert wird, erscheint sie natürlich wieder Maximized, auch wenn der User sie in der Zwischenzeit in der Größe geändert hatte.
    Das kann ich natürlich verhindern, wenn ich das direkt im Designer über die Eigenschaften einstelle und nicht mehr im Code aufrufe. Allerdings wird dann die Mainform nicht vollständig geladen, d.h. Menustrip, Grafiken, Labels und Tabelle bleiben komplett leer, bis der Dialog weggeklickt wird.

    2. Eigentlich will ich beim Start einen Begrüßungsbildschirm zeigen, den ich ja über Projekteinstellungen auswählen kann. Das funktioniert grundsätzlich, aber leider nicht, wenn der Dialog mit der Aktivierung aufgerufen wird. Dann bleibt die SplashScreen solange wiederum so lange bestehen, bis der Dialog geschlossen wurde - der allerdings zunächst hinter der SplashScreen versteckt ist....
    Hierzu habe ich leider nur den Hinweis auf

    VB.NET-Quellcode

    1. MyApplication.MinimumSplashScreenDisplayTime
    gefunden, der die minimale Anzeigezeit definiert, aber nicht die maximale.

    Ich scheine hier die Abfolge der Befehle nicht so ganz zu verstehen... was mache ich denn da nur falsch?

    Danke schon mal im Voraus für eure Hilfe,
    Ecki P.


    Microsoft Windows Home 10
    Microsoft Visual Studio Community 2017 / Version 15.8.8
    .NET Framework 4.6.1

    Ecki P.

    Microsoft Windows Home 10
    Microsoft Visual Studio Community 2017 / Version 15.8.8
    Microsoft SQL Server Management Studio 14.0.17289.0
    .NET Framework 4.6.1
    Es hat gar keinen Sinn, sich mit dem Programm zu streiten... am Ende hat es einfach immer Recht!
    @Ecki P. Willkommen im Forum. :thumbup:
    Ohne den ganzen Code lässt sich da nichts sagen.
    Poste mal ne abgespeckte Variante Deines Projekts, die den Effekt reproduziert.
    Projektmappe ohne bon- und obj-Verzeichnis als ZIP anhängen:
    Erweiterte Antwort => Dateianhänge => Hochladen.
    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!
    Hallo Rod,
    danke für die schnelle Reaktion!

    Das erste Problem konnte ich nun aufgrund deiner Anfrage, eine abgespeckte Version zu erstellen, schon lösen: ich ziehe das "Me.WindowState = FormWindowState.Maximized" einfach hinter "IF NewStart…" und belasse die WindowState Eigenschaft im Designer auf "Normal".
    Also erste Lektion gelernt: zur Not mal einen Code in einem separaten Projekt isolieren - kann über Betriebsblindheit hinweg helfen :thumbup:

    Das zweite Problem kriege ich im separaten Code nicht reproduziert 8| … ich schiebe jetzt mal Stück für Stück weitere Subs/Funktionen nach und melde mich dann wieder.

    Gruß,

    Ecki P.

    Microsoft Windows Home 10
    Microsoft Visual Studio Community 2017 / Version 15.8.8
    .NET Framework 4.6.1

    Ecki P.

    Microsoft Windows Home 10
    Microsoft Visual Studio Community 2017 / Version 15.8.8
    Microsoft SQL Server Management Studio 14.0.17289.0
    .NET Framework 4.6.1
    Es hat gar keinen Sinn, sich mit dem Programm zu streiten... am Ende hat es einfach immer Recht!

    Test Programm zum Reproduzieren des Fehlers

    Die angehängte Datei ist nun soweit runter gestrippt, dass nur noch die wesentlichen Elemente drin sind, die das 2. Phänomen verursachen = SplashScreen bleibt offen und verdeckt den aufgerufenen Dialog.

    Mir ist wohl aufgefallen, dass der Fehler nicht auftritt, wenn man statt "frm.ShowDialog()" das Fenster mit "frm.Show()" aufruft. Das bringt dann aber wieder einen Rattenschwanz an weiteren notwendigen Änderungen mit sich - ist durchaus ein Fix aber keine Lösung. Es muss doch irgendwie möglich sein, einen Dialog beim Start aufzurufen, der nicht mit dem SpashScreen kollidiert...

    Auch die o.g. "Lösung" zum 1. Problem ist wohl eher ein Fix. Auch da muss es doch eine echte Lösung geben, die die Ursachen und nicht nur die Symptome angeht.

    Gruß,
    Ecki
    Dateien
    • StartTest.zip

      (41,59 kB, 29 mal heruntergeladen, zuletzt: )

    Ecki P.

    Microsoft Windows Home 10
    Microsoft Visual Studio Community 2017 / Version 15.8.8
    Microsoft SQL Server Management Studio 14.0.17289.0
    .NET Framework 4.6.1
    Es hat gar keinen Sinn, sich mit dem Programm zu streiten... am Ende hat es einfach immer Recht!
    Habe gerade dazugelernt, dass ein SplashScreen wohl in einem eigenen Thread läuft. Ich wollte nen Schließen-Timer in den Splash-Screen einbauen, aber da kam ne nette Message über das threadübergreifende blablabla.

    Verlagere Deinen Init-Code vom Me.Activated-EventHandler in den Me.Shown-EH:

    VB.NET-Quellcode

    1. Private Sub Form_DataList_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    2. Assign_PreSets()
    3. ' Datagridview leeren und aktualisieren
    4. Data_MainTable.Columns.Clear()
    5. Me.WindowState = FormWindowState.Maximized
    6. Dim frm As Form_Message = New Form_Message()
    7. frm.ShowDialog()
    8. End Sub

    Denn Me.Activated wird immer dann aufgerufen, wenn das Form den Eingabefokus erhält. Ok, daher auch die NewStart-Variable (btw: globale Variablen???). Die kann dann nämlich weg.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed - danke für deinen Input. Das funktioniert grundsätzlich, aber nicht im Zusammenspiel mit dem restlichen Programm... da fehlen jetzt ein paar Hintergründe, da ich hier nur das Nötigste gepostet hatte, um den Fehler zu reproduzieren:

    1. beim Start öffnet das Programm die MainForm (die bleibt während des ganzen Programmablaufs offen, z.T. im Hintergrund)
    2. es lädt eine SQL Datenbanktabelle und zeigt die in einem Datagridview an
    3. dann prüft es, ob Einträge veraltet sind - die werden dann im DGV farblich markiert und ein Dialogfenster öffnet sich, in dem ebendiese Datensätze aufgeführt sind.
    4. der User kann das nun ignorieren (Button) oder über Doppelklick auf einen Eintrag den entsprechenden Datensatz editieren.
    5. zum Editieren öffnet sich dann ein weiteres Dialogfenster als Datensatzeditor und das erste Dialogfenster wird geschlossen.
    (In der MainForm kann der Datensatzeditor auch über die Menüleiste (Neueintrag) oder über Doppelklick auf einen Datensatz (Editieren) aufgerufen werden)
    6. wenn der Datensatzeditor geschlossen wird, wird das Hauptfenster wieder aktiv und muss nun die aktualisierte Tabelle laden und prüfen, ob es immer noch veraltete Datensätze gibt - wenn ja, durchläuft er den gleichen Loop (daher die "NewStart" Variable - die wird immer wieder auf TRUE zurückgesetzt, bis der User den "Ingore" Button klickt oder es keine veralteten Datensätze mehr gibt - könnte auch "CheckOverdue" genannt werden).

    Auch wenn der User die alten Datensätze beim Start ignoriert, wird weiterhin bei jeder Aktualisierung auf Überalterung geprüft und im DGV rot markiert.

    Ich glaube also, dass ich den ersten Dialog über den Me.Activated-Eventhandler aufrufen muss.


    (Die Variable "NewStart" hatte ich global definiert, da die MainForm und das Dialogfenster darauf zugreifen - könnte ich wohl auch in der MainForm-Klasse definieren und beim Aufruf des Dialogs mit übergeben.)

    Ecki P.

    Microsoft Windows Home 10
    Microsoft Visual Studio Community 2017 / Version 15.8.8
    Microsoft SQL Server Management Studio 14.0.17289.0
    .NET Framework 4.6.1
    Es hat gar keinen Sinn, sich mit dem Programm zu streiten... am Ende hat es einfach immer Recht!
    @Ecki P. So kannst Du den SplashScreen schließen:
    Teil in der aufrufenden Form:

    VB.NET-Quellcode

    1. Public Sub Form_DataList_Refresh(sender As Object, e As EventArgs) Handles Me.Activated
    2. ' ...
    3. If Application.OpenForms(0) Is Form_SplashScreen Then
    4. Dim dlg = CType(Application.OpenForms(0), Form_SplashScreen)
    5. dlg.CloseForm()
    6. End If
    7. ' ...
    8. End Sub
    Teil in der SplashScreen-Form:

    VB.NET-Quellcode

    1. Public Class Form_SplashScreen
    2. Private Sub Form_Start_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. End Sub
    4. Public Sub CloseForm()
    5. Dim ac As New Action(AddressOf Close)
    6. Me.Invoke(ac)
    7. End Sub
    8. End Class
    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 - BINGO!
    Offensichtlich muss ich das vor dem Aufruf des Dialogfensters einbinden :D
    Vielen Dank!

    Ecki P.

    Microsoft Windows Home 10
    Microsoft Visual Studio Community 2017 / Version 15.8.8
    Microsoft SQL Server Management Studio 14.0.17289.0
    .NET Framework 4.6.1
    Es hat gar keinen Sinn, sich mit dem Programm zu streiten... am Ende hat es einfach immer Recht!