Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Form erzeugen / löschen (https://www.delphipraxis.net/29636-form-erzeugen-loeschen.html)

Hansa 12. Sep 2004 12:36


Form erzeugen / löschen
 
Hi,

meine Forms habe ich vorerst von Delphi erzeugen lassen, also beim Programmstart. Da dies wegen immer mehr Forms langsam unüberschaubar wurde (Reihenfolge usw.), mache ich es nun lieber selber, z.B. so :
Delphi-Quellcode:
frmEing := TfrmEing.Create (self);
frmEing.Show;
Wo packe ich jetzt den passenden Destructor hin ? Eine weitere Frage ist, es wird immer empfohlen, die Forms dynamisch zu erstellen, ich sehe da kaum einen Vorteil, außer, daß die EXE 5% kleiner wurde.

Sharky 12. Sep 2004 12:41

Re: Form erzeugen / löschen
 
Delphi-Quellcode:
frmEing := TfrmEing.Create (self);
frmEing.Show;
Hai Hansa,

da ich meine Forms immer mit .ShowModal erzeuge gebe ich sich einfach danach wieder frei.
Zitat:

..ich sehe da kaum einen Vorteil, außer, daß die EXE 5% kleiner wurde.
Der Speicherverbrauch der Anwendung dürfte aber deutlich kleiner werden da Speicher erst dann angefordert wird wenn er auch gebraucht wird.

Hansa 12. Sep 2004 12:53

Re: Form erzeugen / löschen
 
Wenn ich den Code in ein LabelClick einbaue, was dann, wenn ich es mehrmals anklicke ? Habe ich 10 Forms und erzeuge eine, dann wird wohl Speicher gespart, aber wenn ich nun alle 10 einmal aufrufe, dann ist doch kein Vorteil mehr da, oder doch ? Laut dem Code wird ja sogar jedesmal eine Form erzeugt. Oder wird sie autommatisch gelöscht ? Woher soll Delphi wissen, was überflüssig ist ?

Sharky 12. Sep 2004 12:59

Re: Form erzeugen / löschen
 
Ich meinte das anders. Eine Anwendung von mir besteht z.B. aus über 100 Forms. Im Regelfall werden aber nur 10-20 benutzt. Wenn ich sie jetzt alle beim Programmstart erzeugen würde verbraucht das Programm mehr Speicher als notwendig.
Wenn Du eine Form 10x erzeugst brauchst Du natürlich auch 10x den Speicher.

Hansa 12. Sep 2004 15:43

Re: Form erzeugen / löschen
 
Das ist schon klar, aber wohin jetzt mit dem Create ?

Jelly 12. Sep 2004 15:51

Re: Form erzeugen / löschen
 
Hi,
du kannst im OnClose Event deiner frmEing Form folgendes reinschreiben:
Delphi-Quellcode:
procedure TfrmEing.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     Action := caFree ;
end;
Dann gibst du den Speicher bei Schließen deiner Form wieder frei.

Aber du hast noch einen Denkfehler, in der Art, wie du deine Forms erzeugst mit
Delphi-Quellcode:
frmEing := TfrmEing.Create (self);
frmEing.Show;
da du bei jedem Aufruf deiner Variablen frmEing einen neuen Wert gibst, und du somit keinen Zugriff mehr auf bereits existierende Instanzen von TfrmEing hast. Was dir da übrig bleibt, ist entweder alles in einem Array zu speichern, oder erst gar nicht versuchen, den Pointer zu speichern, und dein Form einfach wie folgt anzuzeigen:
Delphi-Quellcode:
with TfrmEing.Create (self) do begin
   Show;
end ;
Gruß,
Tom

Leuselator 12. Sep 2004 16:13

Re: Form erzeugen / löschen
 
Im Anhang zum letzten Post dieses Threads wirst Du geholfen Hansa.
Gruß

Hansa 12. Sep 2004 18:02

Re: Form erzeugen / löschen
 
Leusels Code kapier ich so nicht recht. Außer, daß er wohl so programmiert wie ich. :mrgreen: Das mit dem caFree von Jelly kommt mir aber bekannt vor. Kann ich nicht einfach das im OnClose einbauen ?

Jelly 12. Sep 2004 18:06

Re: Form erzeugen / löschen
 
Zitat:

Zitat von Hansa
Kann ich nicht einfach das im OnClose einbauen ?

Na dann lies meinen Beitrag doch nochmal genauer :zwinker:

Hansa 12. Sep 2004 18:20

Re: Form erzeugen / löschen
 
Was soll ich denn da noch lesen. 8) Reicht ein caFree im OnClose nun oder nicht ? Die OH kennt das bei mir nicht. Oder besser noch, wie überprüfe ich das ganze, ob der Speicher freigegeben wurde ? Mit Memavail ?

Jelly 12. Sep 2004 18:29

Re: Form erzeugen / löschen
 
Zitat:

Zitat von Hansa
Kann ich nicht einfach das im OnClose einbauen ?

Ich hab doch in meinem Beispiel den Code im OnClose eingebaut... Mit Action := caFree gibts du den Speicher wieder frei, wenn das Fenster geschlossen wird.

Hansa 12. Sep 2004 18:58

Re: Form erzeugen / löschen
 
Verdammt, dann muß ich noch überall ein OnClose einbauen ? :shock:

Jelly 12. Sep 2004 19:06

Re: Form erzeugen / löschen
 
Zitat:

Zitat von Hansa
Verdammt, dann muß ich noch überall ein OnClose einbauen ? :shock:

Oder du erzeugst dir eine neue Formklasse, wo das im OnClose Ereignis bereits ausgeführt wird. Dann musst du aber sämtliche Forms von deiner neuen Klasse ableiten anstatt von TForm... Der Aufwand wird sich also kaum lohnen.

Hansa 12. Sep 2004 19:57

Re: Form erzeugen / löschen
 
Doch, selbst wenn ich das nicht hätte, so würde der Aufwand sich lohnen. Man überlege mal, wie lange es dauert so einen eventuellen Fehler bei 200 Forms nur zu lokalisieren.

Aber bei mir ist das unwichtig. Alle Forms sind abgeleitet mit der Objektablage. Ich habe oft genug die Vorteile davon erläutert. 8) Insofern ändere ich nur die Grundformen und fertig. Wahrscheinlich besteht die Arbeit lediglich in einer 2-zeiligen Erweiterung einer einzigen Form. :lol:

Leuselator 12. Sep 2004 21:46

Re: Form erzeugen / löschen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dann (Objektablage) lege ich Dir erst recht nochmal meine Herangehensweise an's Herz Hansa, Da Du mit der Klassenfunktion eine allgemeingültige Möglichkeit hast, das Formular dynamisch zu erzeugen und beim schließen auch wieder freizugeben...

Habe Dir auch noch ein paar Komentare dazugeschrieben :mrgreen:

Gruß


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