Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Splashscreen: Formcreate der Mainform ausführen (https://www.delphipraxis.net/96181-splashscreen-formcreate-der-mainform-ausfuehren.html)

Svenkan 19. Jul 2007 22:39


Splashscreen: Formcreate der Mainform ausführen
 
Hey!
Ich habe einen Splashscreen in meine Anwendung eingebaut. Ich möchte nun, dass währenddessen auch direkt THauptform.FormCreate ausgeführt wird und erst nach deren Abschließen der Screen geschlossen wird.

Delphi-Quellcode:
procedure TSplash.SetInitializationDone(const Value: Boolean);
begin
  FInitializationDone := Value;
  Close;
end;

procedure TSplash.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  CanClose := (not Timer1.Enabled) and FInitializationDone;
end;

procedure TSplash.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  Close;
end;

procedure TSplash.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Splash := nil;
end;

Jelly 19. Jul 2007 22:48

Re: Splashscreen: Formcreate der Mainform ausführen
 
Wo zeigst du denn den Splashscreen an, das geht aus deinem Code nicht hervor.

Wenn du den Screen mit Show() aufrufst, wird der restliche Initialisierungscode aus deinem Hauptformular doch weiter geladen.
Wenn du Darstellungsprobleme kriegst, z.B: wenn du eine andere Anwendung über den Splashscreen ziehst, so wird dieser nicht neu gezeichnet, kannst du die ganze Splashgeschichte auch in einen eigenen Thread auslagern.

Svenkan 19. Jul 2007 23:24

Re: Splashscreen: Formcreate der Mainform ausführen
 
Ich habe dieses Tutorial von dieser Seite benutzt. Dort wird der Splash-Screen in folgendem Code abgerufen:

Delphi-Quellcode:
begin
  Splash := TSplash.Create(Application);
  try
    Splash.Show;
    Splash.Refresh;
    Application.Initialize;
    Application.Title := 'VPlan';
    Application.CreateForm(THauptform, Hauptform);
    Application.CreateForm(TGrundeinstellungen, Grundeinstellungen);
    Application.CreateForm(TAbout, About);
    Application.CreateForm(TLizenz, Lizenz);
    Application.CreateForm(THTMLFarben, HTMLFarben);
    Application.CreateForm(TSettings_FTP, Settings_FTP);
    Application.CreateForm(TIndexseite, Indexseite);
  finally
    Splash.InitializationDone := True;
  end;
  Application.Run;

Jelly 19. Jul 2007 23:38

Re: Splashscreen: Formcreate der Mainform ausführen
 
Ja, und was funktioniert nicht an dem Code ? Die ganzen Application.CreateForm werden doch nach Anzeigen des Splashscreens durchgeführt und zum Schluss wird der Splashscreen wieder ausgeblendet.

Flare 19. Jul 2007 23:41

Re: Splashscreen: Formcreate der Mainform ausführen
 
Startet nicht Application.Run erst die Nachrichtenschleife?
Wenn ja, dann müsste das nach dem Erzeugen des Splash-Screens geschrieben werden, nicht erst am Ende wenn schon alle Formulare fertig geladen sind. Genau so würde ich das Apllication.Initialize vor die Erzeugung des Screens schreiben.


Flare

Jelly 19. Jul 2007 23:50

Re: Splashscreen: Formcreate der Mainform ausführen
 
Ich denke nicht dass das Abarbeiten von Botschaften und Events für Ladeverzögerungen verantwortlich sind (in der Regel). Du kannst natürlich auch im OnShow Event deines Hauptformulars den SPlashscreen schliessen.

FAlter 20. Jul 2007 07:47

Re: Splashscreen: Formcreate der Mainform ausführen
 
Hi,

ich bevorzuge für SplashScreens folgendes:

Der SplaschScreen wird unter den Projektoptionen deaktiviert, sodass man ihn manuell erstellen muss.

Delphi-Quellcode:
uses
  USplash;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  SplashScreen := TSplashScreen.Create(Application);
  SplashScreen.Show;
  Application.ProcessMessages;

  //Initialisation - währenddessen wird der Splash angezeigt!
  Blablubb := TBlablubb.Create('blubbblubb');
end;

procedure TMainForm.FormActivate(Sender; TObject);
begin
  if Assigned(SplashScreen) then
  begin
    //Hier wird das Hauptfenster schon angezeigt. Alternativ OnShow verwenden.

    //Manchmal mache ich hier noch eine Zeitprüfung
    //damit der SplashScreen auch auf schnellen
    //Systemen nicht nur kurz aufblitzt, sondern
    //lesbar ist.

    //SplashScreen.Hide; //nicht notwendig
    FreeAndNil(SplashScreen);
  end;
end;
Mfg
FAlter


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:16 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