Delphi Splash Screen

Zum Programmstart Infos anzeigen und die Ladezeit des Hauptformulars überbrücken. Das ist der Zweck eines „Startbildschirms“. Lösungsvorschläge gibt es diverse, doch kaum einer ist geschmeidig.

Die hier vorgestellte Lösung ist ein Konglomerat verschiedener Quellen, die zwar häufig funktionslos, jedoch gute Ideengeber waren. Statt eines weiteren endlosen YouTube-Videos, bei dem ausgiebig das Positionieren von Elementen und zig-fache Scheitern beim Compilieren einer unbefriedigenden Lösung gezeigt wird, erläutere ich hier eine elegante Variante, inklusive funktionsfähigem Quellcode zum Download.

Die Anforderung

So banal ein Startschirm in der Erscheinung wirkt, ist die Umsetzung davon kniffliger, wenn er geschmeidig sein soll:

  • Der Start des Hauptprogramms darf weder verzögert noch behindert werden.
  • Das Gezeigte soll lange genug sichtbar sein, damit es zumindest überflogen werden kann.
  • Nach der Anzeige sollen keine Reste davon im Speicher Platz belegen.

Die Lösung

Der Schlüssel liegt in der Projektdatei von Delphi. Hier werden alle Programmteile zusammengefügt und die Anwendung gestartet. Der Startbildschirm nimmt dabei eine Sonderstellung ein: Er soll einerseits zwar vom Programmstart abhängig, der eigentliche Programmstart davon jedoch entkoppelt sein.

Hauptprogramm

Das wird „wie immer“ erstellt. Hier gibt es keine besonderen Anforderungen, das bleibt, wie es ist.

Startschirm

Der wird als neues Formular dem Projekt hinzugefügt und nach Wunsch gestaltet. Rand und Menü-Symbole sind Geschmackssache, ich blende beides aus, weil es irreführend ist: Ein Startschirm ist kein „richtiges“ Programmfenster und hat keine weitere Funktion. Relevant ist jedoch die Eigenschaft FormStyle = fsStayOnTop, damit das Formular „ganz oben“ sichtbar ist.

Die Mindestanzeigedauer wird mit einem TTimer realisiert. Der besondere Kniff: Das Schließen ist von einer von mir so benannten und bereit gestellten Eigenschaft Remove abhängig, die das Formular als property in der Projektdatei ansprechbar macht.

Zeitsteuerung und „aufräumen“ wird in Ereignissen des Splash-Formulars organisiert. Details siehe dort.

Tipp: Das Timer-Interval sollte kleiner als die Mindestanzeigedauer sein. Die sollte „etwas kleiner“ als ein Vielfaches des Intervalls sein. Das legt fest, wie viel die Anzeige ggf. länger als die Mindestdauer ist.

Die Projektdatei

Die Projektdatei fristet üblicherweise ein Schattendasein. Die Delphi-IDE generiert diese Datei automatisch, weshalb sie unterschätzt wird. Denn sie kann genauso Programmfunktionen ausführen wie alle anderen Units. Da sie für die Ladereihenfolge der Elemente verantwortlich ist, wird hier die Splash-Screen-Steuerung integriert.

Vorweg wird der im Projekt erzeugte Splash-Screen in den Projektoptionen → Anwendung → Formulare1 aus der Liste der automatisch erzeugten Formulare in die Liste der verfügbaren Formulare verschonben („nach rechts“), damit das „Formulare aufräumen“ störungsfrei funktioniert.

Mit den dafür vorgesehen Funktionen wird der Startschirm von Hand erzeugt und angezeigt, bevor die eigentliche Anwendungsinitialisierung erfolgt. Ist das alles erledigt, wird dem Splash-Screen die Erlaubnis zum Schließen erteilt. Dafür wird die dem Formular hinzugefügte Eigenschaft Remove benutzt.

Der Schirm bleibt so lange geöffnet, bis die Mindestdauer erreicht ist, während darunter die Hauptanwendung schon bereitstehen und benutzt werden kann. Sollte das Einrichten der Hauptanwendung länger dauern, schließt der Startschirm erst, wenn er schließen darf. Es gibt also eine lose Beziehung zwischen Startschirm und Hauptanwendung, jedoch keine Blockade von irgend etwas.

Das ist der Fall, wenn – wie bei diversen Vorschlägen – die Splash-Wartezeit mit der Funktion sleep() realisiert wird. Die legt für die eingestellte Zeit den kompletten Rechner lahm…

Warum das geschmeidig funktioniert

Der „Kniff“ ist die Entkopplung des Startschirms vom eigentlichen Programm. Während das noch mit Startklar machen beschäftigt ist, wird vorneweg der Startschirm gezeigt. Dessen Anzeige wiederum ist unabhängig vom Hauptprogramm. Das muss „arbeitsfertig“ sein, bevor dem Startschirm das Schließen erlaubt wird. Der entscheidet dann über das eingestellte Timer-Intervall und die Mindestdauer, ob oder wie lange er noch sichtbar ist und räumt sich nach dem Schließen selbst auf.

Das Demo-Programm

Die Demo „kann nix außer Startschirm zeigen“. Sowohl auf dem Hauptformular als auch dem Splash-Screen ist lediglich ein Label zur Identifizierung. Diese Quelle ist mit „Rio“ erstellt, verwendete Funktionen sind durchweg „Grundfunktionalität“, daher sollte das Beispiel sowohl abwärts kompatibel, als auch FreePascal-tauglich sein2.

Alles auspacken, SplashDemo.dpr öffnen, compilieren, dann den Code ansehen — oder mir schreiben , dass es mit Delphi … / FreePascal doch Probleme gibt. Vorzugsweise mit Hinweis, welche, idealerweise mit entsprechend korrigierten Quellen.

Beispielprogramm (Quellcode) in 7z-Archiv herunter laden

7z? Hier Infos und kostenloser Download

Diese Quellen dürfen gemäß MIT-Lizenz verwendet und verteilt werden.


  1. Dort ist es in der „Rio“-IDE. In anderen Umgebungen kann das wo anders sein. ↩︎

  2. Die Benennung der verwendeten Units könnte Fehler erzeugen. Da muss dann ggf. „rückwärts“ gesucht werden, in welcher sich die verwendeten Funktion befinden. ↩︎