![]() |
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. |
Re: Tutorial: Splash Screens
Sicher ist sicher, folgende Zeile noch einfügen:
Code:
...:cat:...
procedure TfrmMain.FormCreate(Sender: TObject);
begin Sleep(1500); frmSplash.Label1.Caption := 'Initializing...'; [color=#008000]frmSplash.Refresh;[/color] end; |
Re: Tutorial: Splash Screens
Wann wird der Splash Screen den nicht neu gezeichnet?
|
Re: Tutorial: Splash Screens
Zitat:
...:cat:... |
Re: Tutorial: Splash Screens
Zitat:
Ich wollte doch nur wissen, wann das denn der Fall sein kann, dass das Label nicht neu gezeichnet wird!? :-D |
Re: Tutorial: Splash Screens
Sorry :oops: Wenn Dein Programm mehr macht als nur Zeit verstreichen zu lassen. Also wenn der SplashScreen angezeigt wird und im Hintergrund wirklich die Anwendung geladen wird, Daten analysiert, etc. ;-) Der SplashScreen wird nur dann neu gezeichnet, wenn die Anwendung gerade nichts tut ("ThreadState" ist idle).
...:cat:... |
Re: Tutorial: Splash Screens
Ahhh, richtig! :idea:
Jetzt wird mir auch klar, warum manchmal ein Programm seine GUI nicht updatet, wenn es ausgelastet ist! Danke sakura! *streichel* |
Re: Tutorial: Splash Screens
Hi,
erst ma n1 zum Tutorial. Hat sofort funktioniert, als ich es einbaute, aber ;) Ich erstelle hinter dem Splash Screen andere Formulare
Delphi-Quellcode:
Jenes Formular wird von mir nach dem Create sofort wieder gefreeed, sodass es eigentlich nicht zu einem Zeichnen des Formulars kommen kann, aber trotzdem sehe ich ein graues Fenster das kurz zuckt, also sich anzeigt und sich dann closed!
Application.CreateForm(TdasFormular, dasFormular);
dasFormular.Free; Also mein Splash - Screen sollte halt vor allem Modal sein, was im Hintergrund passiert! Ich versteh das halt nicht warum da das Fenster angezeigt wird, aber ich es erstens Visible := FALSE gesetz habe und zweitens ich es eigentlich gar nicht zum zeichnen auffordere, also mit
Delphi-Quellcode:
Need Help :)
dasFormular.Show;
tHx schon ma! gReetz PlaneT |
Re: Tutorial: Splash Screens
Gegen das "aufblitzen" des Forms kann ich Dir nicht helfen, aber den Splash könntest Du mit FormStykle zu fsStayOnTop im ObjectInspector nachhelfen ;-)
...:cat:... |
Re: Tutorial: Splash Screens
Supi, des funtzt!
tHx nochma für die Hilfe und dein schnelles reagieren :thuimb: |
Re: Tutorial: Splash Screens
Zitat:
Zitat:
...:cat:... |
Re: Tutorial: Splash Screens
Hi schonwieder :P
Wie gesagt funtzt das ja alles, nur wenn die andren Formulare im Hintergrund erstellt werden blitzt die Taskbar kurz auf und verschwindet dann wieder, sodass das Flag im Formular fsStayOnTop wieder greift! Kann man das so machen das die Taskbar ganz unsichtbar gemacht wird? |
Re: Tutorial: Splash Screens
Das hat nichts direkt mit den Splash-Screens zu tun. Stelle diese Frage einfach mal seperat im Forum, damit auch die richtigen vorbeischauen...
...:cat:... |
Re: Tutorial: Splash Screens
Liste der Anhänge anzeigen (Anzahl: 1)
Hi erstmal,
ich habe dieses auch erstmal an einem neuen Proggi getestet wo es auch auf anhieb ging, bloß wo ich jetzt in ein älteres vorhandenes einbauen wollte geht es nicht. a) es vertrag sich in der Form net mit einer anderen aktion oder b) ich bin zu blöd :roll: Picture gibts hier (s. Anhang) Überhaupt gleich mal ne andere Frage mit. Ist es normal das wenn man ein Proggi bastelt das dass auf jedem Rechner immer total anders aussieht?? Hab nähmlich mal Zuhause etwas für die Schule gemacht und als ich das dann in der Schule für den letzten Schliff öffnen wollte hats mich vom Stuhl gehauen, da war alles total verschoben, ..., ist doch net normal oder:?: :?: thx :!: [edit=Admin]So große Bilder bitte nicht direkt einbinden, sondern als Anhang hinterlegen. Mfg, Daniel[/edit] |
Re: Tutorial: Splash Screens
Hi!
Ich vermute mal, du hast die Splash-Screen-Form jetzt nicht erstellt, oder? Ciao fkerber P.S. so riesen-Bilder bitte als Anhang... |
Re: Tutorial: Splash Screens
1. Das Splash-Form sollte in der DPR - Datei, nicht in der Form-Datei dargestellt werden.
2. Die Datei des Form muß in der Uses-Klausel aufgenommen werden. ...:cat:... |
Re: Tutorial: Splash Screens
Zitat:
und danke für eure schnellen Antworten jetzt habe ich so weit das es zu kompilieren geht, aber die Datei am ende Fehlerhaft ist, ich kann andere Forms net mehr öffen, immer wenn ich den dazu gehörigen Button anklick bekomme ich einen Fehlermeldund, "Speicher an XYZ fehlerhaft". Desweiteren ist da die Leiste mit den Minimieren/ Verkleinern/ Schließen zusehen mit vorhanden. |
Re: Tutorial: Splash Screens
Zitat:
MfG Lorenz |
Re: Tutorial: Splash Screens
Hi Mieze,
cooles Tut. Aber leider "fehlt" mir da noch was. Manche Programme haben im SplashScreen so nen Ladenbalken und oberdrüber ein Label. Beim Label steht drin was das Programm grad macht (z.B. einstellungen laden,...) und im Ladebalken steht der Fortschritt. Wie wird den sowas realisiert? |
Re: Tutorial: Splash Screens
Zitat:
|
Re: Tutorial: Splash Screens
Im Konstruktor des Splash-Forms Sollte Folgendes stehen:
Delphi-Quellcode:
Beim Debuggen mit Delphi wird so verhindert, dass sich der
function RunningInDelphi: Boolean;
begin Result := DebugHook <> 0; end; procedure TfrmSplash.FormCreate(Sender: TObject); begin if RunningInDelphi then FormStyle := fsNormal else FormStyle := fsStayOnTop; end; Splash-Screen über die Delphi-IDE legt. :hello: |
Re: Tutorial: Splash Screens
also ich habe es jetzt soweit hin bekommen das es mit dem Splash geht, es kommt und dann öffnet sich die hauptform(Hauptdatei), bloß habe ich im hauptfromular auch den folgenden Code enthalten
Code:
bloß geht das net, er kompiliert es aber, wenn ich deie entsprechenden Button auswähle erhalte ich immer einen Speicherfehler an XYZ "0000000".
procedure TfrmMain.Button3Click(Sender: TObject);
begin Form3.ShowModal; end; aber der Rest geht einwandfrei, die anderen Form`s. Bild füge ich später bei, geht zur Zeit bloß net (Schule). thx :!: |
Re: Tutorial: Splash Screens
Zitat:
Delphi-Quellcode:
gemacht (will heissen: Das Formular erzeugt), bevor Du versuchst es anzuzeigen?
Form3 := TForm3.Create(application);
|
Re: Tutorial: Splash Screens
danke :!: das war es, ...
|
Re: Tutorial: Splash Screens
naja, ich bins nochmal :wink:
noch eine letzte Frage, wie mach ich das bzw. was muss ich ändern wenn ich das splash auch sehen will wenn ich die Form3 öffne?! (post oben drüber) |
Re: Tutorial: Splash Screens
Hallo Canada,
Ja nicht mit StayOnTop? :gruebel: MfG Lorenz |
Re: Tutorial: Splash Screens
Vorher (also vor Form3.Show) den Splashscreen erzeugen, anzeigen und nach dem Show wieder zerstören. - Halt aus der Unit raus aber mit demselben Code wie in der Projektdatei.
|
Re: Tutorial: Splash Screens
Phoenix das geht bei mir trotzdem net, allg. oder ich hab wieder einen schönheits Fehler mit drinne ...
könntest du dir das mal anschauen, wäre ganz net :!: |
Re: Tutorial: Splash Screens
Hi, ich hab leider auch ein Problem mit meinem Splashscreen
Der Splashscreen enthält eine Progressbar, die anzeigt inwieweit das Programm seine Daten vorbereitet hat. Die Daten werden dabei im Hauptformular aufbereitet über OnCreate. Nur leider erhalte ich immer eine EExternalException und verstehe nicht wo das Problem ist
Delphi-Quellcode:
begin
try Splash := TSplash.Create(Application); Splash.Show; Application.Initialize; Splash.Update; Application.CreateForm(TForm1, Form1); finally Splash.Hide; Splash.Release; end; Application.Run; end.
Delphi-Quellcode:
Die Unit des Splashscreens enthält keine Funktionen/Ereignisse
//Hauptformular
procedure TForm1.FormCreate(Sender: TObject); begin ... // von hier aus wird die Progressbar und ein Label des Splashscreens gesteuert end; Hoffe jemand kann mir weiterhelfen, Danke |
Re: Tutorial: Splash Screens
Hi!
Wann genau tritt den die Exception auf? In welcher Zeile tritt sie auf? Was steht in der OnCreate des Haupformulars drin? Ciao fkerber |
Re: Tutorial: Splash Screens
oh man bin ich ein Trottel, es lang lediglich an einem TRegistry.Free, was ausversehen anstelle ans Ende des OnCreate, mitten hinein gelangte. Nach dieser Zeile wurde aber noch auf die Registry zugriffen wodurch dann diese Exception ausgelöst wurde.
War vielleicht gestern schon zu spät für nen klaren Kopf ;) Danke && Greetz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:15 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