Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Formular im Hintergrund aufbauen? (https://www.delphipraxis.net/148235-formular-im-hintergrund-aufbauen.html)

Mattze 25. Feb 2010 15:28


Formular im Hintergrund aufbauen?
 
Hallo,

gut, mein Programm braucht "nur" wenige Sekunden, um zu starten. Aber das ist mir immer noch zu lange, um dem ganzen Fensteraufbau zuzuschauen.

Wie kann man das Programm so starten, dass es das Hauptformular mit allen Komponenten usw. fertig im Speicher baut und es erst dann anzeigt.
(Ich habe alles mögliche probiert. Natürlich auch Doublepuffer. Es funktioniert nicht. Ich krieg's einfach nicht raus!)

Gibt's da was? Am liebsten wäre mir ein Codeschnipsel, wie man so was macht!

Gruß
Mattze

DeddyH 25. Feb 2010 15:36

Re: Formular im Hintergrund aufbauen?
 
Machst Du evtl. umfangreiche Berechnungen oder dergleichen im OnShow?

dominikkv 25. Feb 2010 15:36

Re: Formular im Hintergrund aufbauen?
 
Such hier mal nach Hier im Forum suchenSplashScreen.

Alaitoc 25. Feb 2010 15:38

Re: Formular im Hintergrund aufbauen?
 
Naja eine Möglichkeit wäre es wenn du einen Ladedialog hättest, der sich erst schließt wenn das Formular halt alles erstellt hat und solange ist das Hauptformular halt unsichtbar.

Edit: Der genannte "Splashscreen"

Dann könntest du noch z.b. dem Fenster einen Initial-Zustand geben, den Cursor zur Sanduhr machen und die Zeichenfunktion des Formulars deaktivieren. Dann alles initialisieren und den Cursor, sowie die Zeichenfunktion wiederherstellen.

Zum Deaktivieren des Zeichenvorgang eines Formulars:

Delphi-Quellcode:

procedure LockWinControl( const oWinControl: TWinControl );
begin
  if Assigned ( oWinControl ) then
  begin
    // Handle erstellen, falls noch nicht vorhanden
    oWinControl.HandleNeeded;
    // Deaktivieren von Repaint
    SendMessage( oWinControl.Handle, WM_SETREDRAW, 0, 0 );
  end;
end;

procedure UnlockWinControl( const oWinControl: TWinControl );
begin
  if Assigned ( coWinControl ) then
  begin
    // Handle erstellen, falls noch nicht vorhanden
    oWinControl.HandleNeeded;
    // Aktivieren von Repaint
    SendMessage( oWinControl.Handle, WM_SETREDRAW, 1, 0 );
    // Repaint ausführen
    RedrawWindow( oWinControl.Handle, nil, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN );
  end;
end;
Oder natürlich die eleganteste Lösung wäre wohl Zustandshandling, wobei ich dazu irgendwie grad keinen Link finde...

MfG Alaitoc

Mattze 28. Feb 2010 12:16

Re: Formular im Hintergrund aufbauen?
 
Hallo,

vielen Dank für den Tipp mit dem Splashscreen. Der macht es zwar leider auch nicht, bindet aber so stark die Aufmerksamkeit, dass der eigentliche Seitenaufbau des Hauptformulars nicht mehr so doll stört.

Das mit dem LockwinControl usw. habe schon mal versucht, hat aber auch nichts gebracht.

Momentan bin ich beim Application.minimize. Wenn ich dann in die Taskleiste clicke und das Programm maximiere, wird es sofort bildschirmfüllend angezeigt. Da wird dann nix mehr aufgebaut.
Wie ich das per Code mache, weiß ich auch. (Brauche ja nur bei Application.restore zu schmulen.)
Wo ich das jedoch per Code (also ohne Click) machen soll, weiß ich absolut nicht.

Hat jemand einen Tipp, wie man ein Ereignis von Application (Evtl. zeitgesteuert) feuern kann, wenn sie minimiert ist? (Ein Ereignis vom Hauptformular scheint dann ja nicht einzutreten, oder?)

Gruß
Matthias

SirThornberry 28. Feb 2010 12:20

Re: Formular im Hintergrund aufbauen?
 
Irgendwie verstehe ich noch immer nicht was du eigentlich willst. Dich stört das der Aufbau solange dauert. Und du willst das erstellen deshalb im Hintergrund erledigen. Was du uns allerdings noch nicht gesagt hast (oder ich habe es überlesen): Was soll im Vordergrund in der Zeit passieren.

Mattze 28. Feb 2010 12:43

Re: Formular im Hintergrund aufbauen?
 
Nix!

Kurze Frage, kurze Antwort. ;-)

Es soll alles so bleiben, wie es ist. Also Desktop usw.
Wenn der Bildschirmaufbau im Hintergrund fertig ist, dann soll es angezeigt werden. Aber auch erst dann.

Um das noch einmal zu betonen: Es geht hier nicht um Stunden!
Der Bildschirmaufbau geht schon recht schnell, aber eben doch nicht schnell genug, um es zu sehen.
Und das gefällt mir nun mal nicht.

Da es solche "Hintergrundmacher" gibt (DoubleBuffered) und ein Formular diese Eigenschaft auch hat, dachte ich,
man könne das direkt in der Application für den Hintergrundaufbau des Hauptformulares verwenden.
Kann man scheinbar aber doch nicht. Schade!

Gruß
Mattze

SirThornberry 28. Feb 2010 12:56

Re: Formular im Hintergrund aufbauen?
 
Das ist nur sehr schwer realisierbar. Viele Komponenten zeichnen sich erst wenn es auch wirklich notwendig ist, sie also im sichtbaren Bereich liegen. Und den Teil den sie zeichnen, speichern sie sogar noch zwischen um beim wiederholten Zeichnen schneller zu sein.
Und dann kommt noch dazu das Delphi die Fenster erst erzeugt wenn darauf auch gemalt werden soll. Und das ist vermutlich der Grund das bei dir dann alles so nacheinander aufbaut.

Mattze 28. Feb 2010 15:38

Re: Formular im Hintergrund aufbauen?
 
Nun ja,

es war eben einen Versuch wert.
Ich habe mir schon so was gedacht, als ich durch den Splashscreen mitbekam, dass er bei
Application.Initialize;
Application.CreateForm(THauptformular, Hauptformular);
gar nicht die Zeit verbraucht und erst danach den Bildschirm wirklich aufbaut.

Das interessante istmomentan, dass er das beim Start mit Application.minimize in der .dpr
in die Taskleiste schreibt und von da beim Click SOFORT alles da ist.
Also nicht, als wenn er die BS-Ausgabe Stück für Stück aufbaut, sondern als wenn er aus einem Puffer alles auf einmal auf den BS holt.

Auf jeden Fall erstmal danke für Eure Tipps!

Gruß
Mattze


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