![]() |
Tutorial: Splash Screens
Hi DPler,
immer wieder kommt die Frage danach, wie Splash Screens bzw. "Startbildschirmen" gemacht werden können. Also, die Implementierung ist einfacher, als viele es glauben wollen. Folgend meine zwei beliebtesten Methoden, Splash Screens zu implementieren. Dabei ist die grundlegende Vorgehensweise immer identisch. Zum Üben einfach mal mitmachen und dann die präferierte Methode annehmen ;-) Let's roll! Delphi starten und eine neue Anwendung erstellen. Die Anwendung und das Hauptformular an gewünschter Stelle auf der Festplatte speichern. Anschließend im Objekt Inspektor dem Hauptformular einen beliebigen Namen geben. In den Bespielen heißt dieses frmMain. Damit wir bei unserer Super-Beispiel-Anwendung auch mal einen "vernünftigen" Grund für einen Splash-Screen erzwingen, folgenden Code in das OnCreate-Ereignis einfügen.
Delphi-Quellcode:
Dann noch einen Button aufs Form werfen und folgenden Code in des OnClick-Ereignis einfügen.
procedure TfrmMain.FormCreate(Sender: TObject);
begin Sleep(1500); end;
Delphi-Quellcode:
Soweit die Vorbereitung auf Seiten des Hauptformulars. Jetzt gehts an den Splash Screen. Dazu erstellen wir ein neues Formular und speichern auch dieses. Als Namen im Objekt Inspektor bitte frmSplash eingeben (damit die Beispiele funktionieren). Ansonsten ist der natürlich auch frei wählbar.
procedure TfrmMain.btnBoahClick(Sender: TObject);
begin Close; end; Jetzt das Splash Formular nach belieben "stylen" und weiter gehts. Im folgenden Beispiel ist einfach ein hübsches Bildchen zu sehen ;-) Weiter gehts. Folgend zu den beiden Standard-Methoden.
Anschließend kommt der Teil im Projekt, welcher wieder identisch für alle Lösungen ist. ...:cat:... |
Re: Tutorial: Splash Screens
Bitte warten Sie, während die Anwendung startet...
Um dieses Verhalten zu erreichen, müssen wir zwei Dinge tun. Erstens, das Splash-Formular muss "wissen", wann alle Vorbereitungen zum Start getroffen wurden, und zweitens, das Splash-Formular muss "wissen", wann die drei Sekunden abgelaufen sind. Punkt 1 Dazu legen wir einfach eine Eigenschaft an, welche den Typ Boolean hat und den Status der Anwedung speichert. Wenn der Status geändert wird, versuchen wir das Splash-Form zu schließen.
Delphi-Quellcode:
Ausserdem fügen wir noch einen TTimer auf das Formular ein, setzen das Intervall auf 3000 (3 Sekunden) und stellen sicher, daß Enabled auf True gesetzt ist. Im OnTimer Ereignis disablen wir den Timer (es müssen ja nur die ersten 3 Sekunden abgelaufen sein ;-) ) und versuchen wiederum das Form zu schließen.
type
TfrmSplash = class(TForm) ... private { Private declarations } FInitializationDone: Boolean; procedure SetInitializationDone(const Value: Boolean); ... public { Public declarations } property InitializationDone: Boolean read FInitializationDone write SetInitializationDone; ... end; procedure TfrmSplash.SetInitializationDone(const Value: Boolean); begin FInitializationDone := Value; Close; end;
Delphi-Quellcode:
Jetzt zum "Trick"
procedure TfrmSplash.tmrMinTimingTimer(Sender: TObject);
begin tmrMinTiming.Enabled := False; Close; end; Wann kann der Splash Screen nun wirklich geschlossen werden? Eigentlich doch nur dann, wenn die Anwendung geladen wurde und wenn die drei Sekunden abgelaufen sind. Das lässt sich recht einfach überprüfen. Ersteres daran, das die Variabe FInitializationDone den Wert True hat und letzteres daran, daß der Timer disabled ist. Dazu einfach folgenden Code in das OnCloseQuery-Ereignis schreiben.
Delphi-Quellcode:
Wie es weiter geht, steht im übernächsten Abschnitt. ;-)
procedure TfrmSplash.FormCloseQuery(Sender: TObject;
var CanClose: Boolean); begin CanClose := (not tmrMinTiming.Enabled) and FInitializationDone; end; ...:cat:... |
Re: Tutorial: Splash Screens
Ich habe fertig, Sie können loslegen...
Ein anderer, hin und wieder gesehener Weg ist es, den User den Splash-Screen manuell ausblenden zu lassen. Sei es, um auf ShareWare Konditionen hinzuweisen oder um ihn einfach zu ärgern :evil: Der Weg ist ähnlich dem vorhergehenden, allerdings brauchen wir keinen Timer. Dazu benötigen wir wieder eine Variable, welche den Status des allgemeinen Ladevorganges sichert.
Delphi-Quellcode:
Sobald die Initialisierung beendet ist, kann der User über einen Schalter das Formular schliessen. Dieser sollte im Objekt Inspektor standardmäßig Enabled auf False gesetzt sein ;-) In das OnClick-Ereignis des Buttons wird noch folgender Code geschrieben.
type
TfrmSplash = class(TForm) ... private { Private declarations } FInitializationDone: Boolean; procedure SetInitializationDone(const Value: Boolean); ... public { Public declarations } property InitializationDone: Boolean read FInitializationDone write SetInitializationDone; ... end; procedure TfrmSplash.SetInitializationDone(const Value: Boolean); begin FInitializationDone := Value; if Value then begin btnStart.Enabled := True; btnStart.Cursor := crHandPoint; end else begin btnStart.Enabled := False; btnStart.Cursor := crHourGlass; end; end;
Delphi-Quellcode:
Fertig. Der Rest im nächsten Abschnitt.
procedure TfrmSplash.btnStartClick(Sender: TObject);
begin Close; end; ...:cat:... |
Re: Tutorial: Splash Screens
Das Splash laden und schließen
Ab hier ist der Vorgang wieder für beide Methoden identisch. In das Splash-Formular sollte jetzt noch das OnClose-Ereignis behandelt werden. Damit wir uns nicht um die Resourcen und den Speicherverbrauch sorgen müssen, reichen folgende Zeilen.
Delphi-Quellcode:
Damit wird dem Formular mitgeteilt, daß es sich selbst zerstören soll. Außerdem setzen wir noch die globale Formvariable wieder auf nil (just in case...).
procedure TfrmSplash.FormClose(Sender: TObject; var Action: TCloseAction);
begin Action := caFree; frmSplash := nil; end; Die Anwendung selbst Wenn Ihr jetzt mal das Code-Fenster der Anwendung ladet, dann seht ihr am Ende folgenden Code
Code:
Die blau dargestellte Zeile ist unter Umständen nicht vorhanden. Das hängt von Euren Einstellungen ab. Sollte diese da sein, einfach löschen!
begin
Application.Initialize; Application.CreateForm(TfrmMain, frmMain); [color=#0000FF]Application.CreateForm(TfrmSplash, frmSplash);[/color] Application.Run; end. Genug der Vorworte. Lasst es uns tun. Hier die Theorie, unten die Implementierung. Wir müssen dazu den Startablauf unseres Programmes ein wenig manipulieren. Als erstes müssen wir das Splash-Form erstellen, aber so, daß die Anwendung dieses nicht als Hauptformular erkennt. Ansonsten würde die Anwendung sich schließen, sobald das Splash-Form freigegeben wird :oops: Anschließend müssen wir das Splash-Form dazu bringen sich darzustellen und es "zwingen" sich neu zu zeichnen, ansonsten wird es wohl nur ein graues Rechteck zu sehen geben. Jetzt wird die Anwedung gestartet und sämtliche Formulare und Datenmodule geladen. Abschließend setzen wir die Eigenschaft frmSplash.InitializationDone auf True und überlassen die Anwendung dem Benutzer.
Delphi-Quellcode:
Fertig!
begin
frmSplash := TfrmSplash.Create(Application); try frmSplash.Show; frmSplash.Refresh; Application.Initialize; Application.CreateForm(TfrmMain, frmMain); // (1) // weitere Formulare und Datenmodule hier her verschieben (siehe 2) finally frmSplash.InitializationDone := True; end; // (2) // Standardmäßig erstellte Formulare wird Delphi hier eintragen // nach (1) verschieben !!! Application.Run; end. ...:cat:... |
Re: Tutorial: Splash Screens
Liste der Anhänge anzeigen (Anzahl: 4)
Die Beispiele
Hier findet Ihr noch die Beispiele zum Tutorial.
...:cat:... |
Re: Tutorial: Splash Screens
Coole Sache das! Thx Sakura!
Ich hab nur eine kleine Anmerkung/Frage: Wie mache ich das denn, dass ich, solange der Splah Screen angezeigt wird, nicht auf die Anwendung zugreifen kann? (In deinen Beispielen kann ich die Anwendung schließen, wenn der Splash Screen noch angezeigt wird) |
Re: Tutorial: Splash Screens
Hi Stevie,
dazu musst Du die Hauptanwendung (die DPR-Datei) von Beispiel einfach wie folgend erweitern und lediglich die grünen Zeilen einfügen.
Code:
...:cat:...
begin
frmSplash := TfrmSplash.Create(Application); try frmSplash.Show; frmSplash.Refresh; Application.Initialize; Application.CreateForm(TfrmMain, frmMain); finally frmSplash.InitializationDone := True; end; [color=#008000]while frmSplash <> nil do Application.ProcessMessages;[/color] Application.Run; end. |
Re: Tutorial: Splash Screens
Noch nicht ganz das, was ich wollte. :wink:
Jetzt wird nämlich das Hauptfenster erst erstellt, wenn der Splash Screen weg ist! Er soll schon zu sehen sein, eben nur nicht Anwählbar (vielleicht irgendwie SplashScreen.ShowModal?!) Und noch ne andere Sache: Wie kann ich während der Initialisierung der Anwendung die Anzeige des SplashScreen ändern? (sowas wie ein Text im Fuß des Splash Screens "Anwendung wird geladen..." ändern in "Konfiguration wird geladen..." usw. ???) |
Re: Tutorial: Splash Screens
Okay, dann wäre noch folgende Lösung anzubieten. Dabei nicht vergessen, die vorhergehenden Änderungen wieder rückgängig zu machen!
Im Objekt Inspektor setzt Du die Eigenschaft Enabled des Hauptformulares auf False. Im Splash-Form im OnClose Ereigniss setzt Du diese dann wieder auf True:
Code:
Zum zweiten: Du musst einfach ein Label aufs Splash-Form setzen (ggf. Transparent machen) und dessen Caption neu setzen. Anschließend mußt Du die Methode Refresh des Splash-Forms aufrufen.
implementation
[color=#008000]uses uFormMain;[/color] {$R *.dfm} procedure TfrmSplash.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; frmSplash := nil; [color=#008000]frmMain.Enabled := True;[/color] end; ...:cat:... |
Re: Tutorial: Splash Screens
Ok, klappt, ich hab's so gemacht:
Code:
implementation
{$R *.dfm} [color=#008000]uses uFormSplash;[/color] procedure TfrmMain.btnBoahClick(Sender: TObject); begin Close; end; procedure TfrmMain.FormCreate(Sender: TObject); begin Sleep(1500); [color=#008000]frmSplash.Label1.Caption := 'Initializing...';[/color] end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz