AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Tutorial: Splash Screens
Tutorial durchsuchen
Ansicht
Themen-Optionen

Tutorial: Splash Screens

Ein Tutorial von sakura · begonnen am 9. Sep 2003 · letzter Beitrag vom 31. Jan 2009
Antwort Antwort
Seite 1 von 10  1 23     Letzte »    
Benutzerbild von sakura
sakura
Registriert seit: 10. Jun 2002
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:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Sleep(1500);
end;
Dann noch einen Button aufs Form werfen und folgenden Code in des OnClick-Ereignis einfügen.

Delphi-Quellcode:
procedure TfrmMain.btnBoahClick(Sender: TObject);
begin
  Close;
end;
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.

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.
  • Der nächste Abschnitt erklärt, wie man das Splash-Form dazu bringt mind. 3 Sekunden zu bleiben und mindestens so lange, bis die Anwendung vollständig initialisiert wurde.
  • Der übernächste Abschnitt zeigt, wie der Splash Screen solange zu sehen ist, bis der User auf den "Starten" Schalter geklickt hat. Dieses kann er natürlich erst dann tun, wenn die Anwendung vollständig initialisiert ist.

Anschließend kommt der Teil im Projekt, welcher wieder identisch für alle Lösungen ist.

......
Ich bin nicht zurück, ich tue nur so
 
Benutzerbild von sakura
sakura

 
Delphi 12 Athens
 
#2
  Alt 9. Sep 2003, 13:57
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:
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;
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.

Delphi-Quellcode:
procedure TfrmSplash.tmrMinTimingTimer(Sender: TObject);
begin
  tmrMinTiming.Enabled := False;
  Close;
end;
Jetzt zum "Trick"

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:
procedure TfrmSplash.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  CanClose := (not tmrMinTiming.Enabled) and FInitializationDone;
end;
Wie es weiter geht, steht im übernächsten Abschnitt.

......
Daniel Lizbeth
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

 
Delphi 12 Athens
 
#3
  Alt 9. Sep 2003, 13:58
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

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

Delphi-Quellcode:
procedure TfrmSplash.btnStartClick(Sender: TObject);
begin
  Close;
end;
Fertig. Der Rest im nächsten Abschnitt.

......
Daniel Lizbeth
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

 
Delphi 12 Athens
 
#4
  Alt 9. Sep 2003, 13:58
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:
procedure TfrmSplash.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  frmSplash := nil;
end;
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...).

Die Anwendung selbst

Wenn Ihr jetzt mal das Code-Fenster der Anwendung ladet, dann seht ihr am Ende folgenden Code

Code:
begin
  Application.Initialize;
  Application.CreateForm(TfrmMain, frmMain);
  [color=#0000FF]Application.CreateForm(TfrmSplash, frmSplash);[/color]
  Application.Run;
end.
Die blau dargestellte Zeile ist unter Umständen nicht vorhanden. Das hängt von Euren Einstellungen ab. Sollte diese da sein, einfach löschen!

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

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:
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.
Fertig!

......
Daniel Lizbeth
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

 
Delphi 12 Athens
 
#5
  Alt 9. Sep 2003, 14:00
Die Beispiele

Hier findet Ihr noch die Beispiele zum Tutorial.
  • Sample App I (Bin).zip Die Exe-Demo zum automatischen Ausblenden des Splash-Screens.
  • Sample App I (Sources).zip Die Quellcodes zum automatischen Ausblenden des Splash-Screens.
  • Sample App II (Bin).zip Die Exe-Demo zum manuellen Ausblenden des Splash-Screens.
  • Sample App II (Sources).zip Die Quellcodes zum manuellen Ausblenden des Splash-Screens.

......
Angehängte Dateien
Dateityp: zip sample_app_i__bin_.zip (202,1 KB, 955x aufgerufen)
Dateityp: zip sample_app_i__sources_.zip (9,8 KB, 835x aufgerufen)
Dateityp: zip sample_app_ii__bin_.zip (202,7 KB, 623x aufgerufen)
Dateityp: zip sample_app_ii__sources_.zip (11,0 KB, 458x aufgerufen)
Daniel Lizbeth
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#6
  Alt 28. Okt 2003, 09:58
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)
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

 
Delphi 12 Athens
 
#7
  Alt 28. Okt 2003, 10:08
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:
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.
......
Daniel Lizbeth
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#8
  Alt 28. Okt 2003, 10:22
Noch nicht ganz das, was ich wollte.
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. ???)
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

 
Delphi 12 Athens
 
#9
  Alt 28. Okt 2003, 10:38
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:
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;
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.

......
Daniel Lizbeth
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#10
  Alt 28. Okt 2003, 10:57
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.
Stefan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 10  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz