Laden...

Splashscreen erstellen, aber wie richtig?

Erstellt von serial vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.357 Views
S
serial Themenstarter:in
902 Beiträge seit 2007
vor 16 Jahren
Splashscreen erstellen, aber wie richtig?

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?

O
778 Beiträge seit 2007
vor 16 Jahren

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

S
serial Themenstarter:in
902 Beiträge seit 2007
vor 16 Jahren

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!

P
48 Beiträge seit 2005
vor 16 Jahren

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:

Splash-Screen
Quick-Guide

--
mfG.
Marcel Eckhoff

J
1.114 Beiträge seit 2007
vor 16 Jahren

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.

J
3.331 Beiträge seit 2006
vor 16 Jahren

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

49.485 Beiträge seit 2005
vor 16 Jahren

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

S
serial Themenstarter:in
902 Beiträge seit 2007
vor 16 Jahren

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!

2.921 Beiträge seit 2005
vor 16 Jahren

@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.

T
147 Beiträge seit 2005
vor 16 Jahren

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.