Hallo,
ich hab mich grad etwas mit Splashscreens beschäftigt, aber die Literatiur dazu zeigt ja immer nur minimalbeispiele!
Normalerweise benutzt man ja ein Splashscreen, um status anzuzeuigen, wo sich programm grad befindet wenn es lädt! (Also DLLs, Componenten, Registrierung auslesen etc..)
Aber wie macht man das?
ICh erzeuge im Programm vor dem Application.Run(new Form1()); ein Splashscreen und zeige diesen an!
Allerdings folgt ja gleich danach das Hauptform!
Sollte man alles (Laden der DLLs etc im Konstruktor der Hauptform machen, befov InitializeComponent() aufgerufen wird?
Ist das der richtige weg?
Normalerweise macht man es so, dass sämtlicher Initialisierungscode in die Form.Load-Ereignisprozedur gepackt wird, die am Anfang einen Splashscreen öffnet und diesen am Ende schließt...
ach die load erzeugt den splash?
Das hab ich wirklich noch nirgends gelesen 😠
Aber wird da nicht auch schon die hauptform angezeigt, dies möchte ich ja erst wenn alles fertig ist!
Hi!
Wenn Du den Splash-Screen im Form.Load-Ereignis des Hauptforms erzeugst, wird auch das Hauptformular angezeigt, was man im allgemeinen nicht möchte, möglicherweise könnte man das Hauptform allerdings unsichtbar machen (visible=false), hab ich aber noch nicht gemacht.
Hier zwei nette Links bezüglich splash-screens:
--
mfG.
Marcel Eckhoff
Im FormLoad Ereignis wird noch nix gezeigt, sondern erst im Shown Ereignis.
Was aber im FormLoad Ereignis schon abgearbeitet ist, das ist der Konstruktor. dort können ja, je nach Vorliebe, auch schon gewisse Initialisierungen ihre Zeit einnehmen. Zumindest InitializeComponent() wird dort aufgerufen.
Ich würde in der Main Methode vor der Erstellung des Hauptformlars das Anzeigen des Splash erzwingen, und am Schluss vom Shown Ereignis des Hauptformulars den Splashscreen wieder schliessen.
Hier ist eine mögliche Realisierung von Jellys Vorschlag, einzubetten in static Main() von Program.cs:
bool StartOK = false;
MainForm main = null;
using(StartForm frmStart = new StartForm()) {
// Start-Formular anzeigen, laufende Anzeige vorbereiten
frmStart.Show();
// Login-Ausführung
LoginForm login = new LoginForm();
StartOK = login.ShowDialog().DialogResult = DialogResult.OK;
if (StartOK) {
main = new MainForm();
// eigentliche Startmaßnahmen ausführen
startOK = main.Init();
}
// Start-Formular schließen
frmStart.Hide();
}
if (startOK && main != null) {
Application.Run(main);
}
Als erstes wird also das Startformular erzeugt und angezeigt, dann das Login und erst danach das Hauptformular. Sinnvollerweise wird dieses zunächst mit Visible=false erzeugt.
Ungeklärt ist bei dieser Lösung, woher das LoginForm seine Informationen erhalten soll, ob die Kombination Nutzer/Passwort korrekt ist. Aber wenn Datenzugriffe sowieso in eigenen Klassen geregelt werden, hat das mit dem MainForm überhaupt nichts zu tun.
Gruß Jürgen
Hallo serial,
was genau stört dich denn an dein "Minimal"-Beispielen, die du hast? Ein SplashScreen ist ja nun auch was ganz simples. Das bekommt man mit wenigen Zeilen Code hin. Deshalb wundert es mich nicht, dass die Beispiele klein sind. Also, was genau ist dein Problem?
herbivore
das problem ist, das diese beispiele nie wirklich etwas aktivies machen, nur das splash anzeigen, danach einfach Thread.Sleep() und dann wieder schliessen!
Kein laden im hauptprogramm, nix!
@Serial, die Kommunikation (Laden von DLLs anzeigen usw.) musst Du Dir dann schon selbst erstellen.
Ich denke nicht, dass der Splashscreen das Laden von DLLs oder sonstiges steuern sollte. Aber er kann die Funktion übernehmen, anzuzeigen was gemacht wird, solange er da ist.
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
moin,
also ich mache einen Splash immer auf folgende Art und Weise
Splash wird Modal mit TopMost geöffnet per ShowSplash(args)
internal static DialogResult ShowSplash(object irgendeinParameter)
{
FormSplash instance = new FormSplash();
instance.Paramenter = irgendeinParameter;
reutrn instance.ShowDialog();
}
im Shown des Splashs Starte ich einen Backgroundworker oder einen Thread und Reporte dann die Statusmeldung und den Fortschritt (für die Progressbar) an das Form.
Im Complete des Backgroundworkers setze ich dann das Dialogresult so dass der 'normale' Anwendungsworkflow weiter gehen kann.