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 Forms direkt oder zur Laufzeit erzeugen ? (https://www.delphipraxis.net/9207-forms-direkt-oder-zur-laufzeit-erzeugen.html)

Hansa 20. Sep 2003 14:26


Forms direkt oder zur Laufzeit erzeugen ?
 
Hi,

wo sind die Vor- und Nachteile der Erzeugung einer Form zur Runtime oder schon zur Designtime ? Bzw. wie wirkt sich das ganze aus ? Sagen wir mal bei mind. 200 Forms.

Phoenix 20. Sep 2003 14:29

Re: Forms direkt oder zur Laufzeit erzeugen ?
 
Das macht sich im Speicherbedarf ganz gehörig bemerkbar.

Wir haben noch kleine Anwendungen mit ca. 100 - 150 Formularen und bereits hier werden Formulare ausschliesslich zur Runtime erzeugt.

Zumal das die Anwendung auch bereits deutlich schneller macht.

Hansa 20. Sep 2003 14:36

Re: Forms direkt oder zur Laufzeit erzeugen ?
 
Zitat:

Zitat von Phoenix
...Zumal das die Anwendung auch bereits deutlich schneller macht.

Wieso schneller ? Wenn die Formulare im Speicher vorhanden sind, was geht da noch schneller ? Außerdem muß man sich doch auch selber drum kümmern, den Speicher wieder freizugeben. Aber noch eine andere Frage: Wovon hängt es ab, wieviel Speicher die Dinger brauchen ? Tja, ich habe hier zig Programme und das soll irgendwann mal eins werden, deshalb stellen sich langsam diese Fragen.

Luckie 21. Sep 2003 03:06

Re: Forms direkt oder zur Laufzeit erzeugen ?
 
Das Laden geht wahrscheinlich schneller, da erstmal nur das Hauptformular in den Speicher muß.

Sharky 21. Sep 2003 07:45

Re: Forms direkt oder zur Laufzeit erzeugen ?
 
Zitat:

Zitat von Hansa
Wieso schneller ? Wenn die Formulare im Speicher vorhanden sind, was geht da noch schneller ? Außerdem muß man sich doch auch selber drum kümmern, den Speicher wieder freizugeben. Aber noch eine andere Frage: Wovon hängt es ab, wieviel Speicher die Dinger brauchen ? Tja, ich habe hier zig Programme und das soll irgendwann mal eins werden, deshalb stellen sich langsam diese Fragen.

Angenenommen Du hast im OnCreate der Formen "Zeitintensive" Dinge wie z.B. das öffenen einer Datenbank inkl. Verbinden und ausführen einer Abfrage. Wenn dies nun in jeder Form wäre und jede Abfrage nur 200ms braucht kannst Du ausrechnen wie lange es dauert bis deine gesamte Anwendung fertig gestartet ist.

Eas mit dem Freigeben vom Speicher ist ja nicht so wild. Ich erzeuge auch alle Fenster zur Laufzeit.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 window : TForm2; // Kunden-Formular
begin
 window := TForm2.Create(self);
try
 with window do
  //z.B. Übergabe von Werten an Variabeln die im Public-Teil stehen
  kunden_id := xxx;
  modus := sb_readonly;
  ShowModal
finally
  FreeAndNil(window);
end;
Wieviel Speicher ein Fensterbenötigt ist wohl in ersterlinie von den Komponenten, Variablen und evnt. Images abhängig die in der Form verwendet werden.

Hansa 21. Sep 2003 10:26

Re: Forms direkt oder zur Laufzeit erzeugen ?
 
Wenn man das alles so liest, benutzen die meisten wohl das Erzeugen zur Laufzeit. Und nicht nur hier. Ich denke aber, das kommt noch von Zeiten des knappen Speichers. Trotz 128 MB und mehr sollte man trotzdem nicht anfangen, so zu programmieren, als sei unendlich viel Speicher vorhanden. Aber die Gefahr besteht trotzdem, daß man etwas nicht mehr freigibt und so dann wieder den Speicherbedarf unnötig in die Höhe treibt.

Und es gibt noch einen Effekt: beim erstmaligen verwenden (automatisch)einer Form, tritt schon eine merkbare Verzögerung auf. Beim zweiten mal nicht mehr. Würde die Form immer von Hand neu erzeugt, gelöscht usw. und die Verzögerung würde dauernd vorhanden sein, so wäre das schon schlechter. Vielleicht wird der Speicher aber doch irgendwann knapp, wenn mans nicht so macht.

D.h., ich bin genauso schlau wie vorher. :bounce1: Wie meistens ist wohl der goldene Mittelweg gefragt. Der sieht dann so aus, die Forms in 2 Arten aufzuteilen, oft und weniger oft benötigte. Letztere dann immer erst zur Laufzeit erzeugen. Die von Sharky angesprochenen Datenmodule z.B. würde man besser wohl direkt beim Programmstart erzeugen, da man die ohnehin braucht.

Phoenix 21. Sep 2003 11:45

Re: Forms direkt oder zur Laufzeit erzeugen ?
 
Das hat nicht nur mit Speicherbedarf zu tun.

Stell Dir vor, Du hast eine Anwendung mit 200 Formularen und alle (oder auch nur die wichtigsten) werden beim starten der Apllikation geladen.

Wenn Du nun einen Rechner hast mit wenig Arbeitsspeicher, dann fängt der schon an auszulagern, während noch nichtmal alles geladen ist. Damit dann noch vernünftig zu arbeiten kannst Du vergessen.

Wie gesagt: Wir haben grosse und komplexe Anwendungen die von Unternehmen eingesetzt werden denen SAP zu oversized ist. Und bis auf das Mainform werden ausnahmslos alle Formulare zur Laufzeit erzeugt. Und langsamer werden unsere Anwendungen dadurch nicht ;-)

Okay, wir gehen da auch sehr streng mit der Trennung von User-Interface und Datenbehandlung um. Du könntest ohne weiteres hingehen, ein Formular einfach entfernen, ein Web-Formular einfügen und schon läuft alles per Webbrowser.

Sollte so etwas später möglich sein ist es unabdingbar, Formulare erst dann zu erzeugen, wenn sie gebraucht werden. Zum Teil weis man vorher noch nichtmal, welches von z.B. 5 möglichen Formularen für eine Aufgabe gerade gewollt ist :)

Aber das sind wie gesagt hochkomplexe Applikationen. Im Prinzip muss das jeder für sich entscheiden wie er das handelt.

Christian Seehase 21. Sep 2003 13:14

Re: Forms direkt oder zur Laufzeit erzeugen ?
 
Moin Zusammen,

was mir in diesem Zusammenhang noch einfällt:
Je nach Betriebbsystem kann man auch bei vielen Formularen Probleme mit den Resourcen, in diesem Zusammenhang speziell, den Handles bekommen, wenn die Formulare mit ihren Steuerelementen sofort beim Programmstart erzeugt werden.


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