Delphi-PRAXiS
Seite 2 von 2     12   

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 prüfen, ob dyn. zur Runtime erzeugte Form Speicher freigibt? (https://www.delphipraxis.net/16943-pruefen-ob-dyn-zur-runtime-erzeugte-form-speicher-freigibt.html)

Leuselator 26. Feb 2004 01:54

Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
 
Vorab: kann sein, das ich hier voll am Thema vorbeischlitter.

Ich mache es mit Formularen, die ich öfter benötige so:
Code:
type
  TMyComponentForm = Class(TPersistent)
  private
    FFenster : TMySpecialForm;
  public
    Constructor Create(AOwner : TComponent); override;
    Destructor Destroy; override;
    procedure Show;
    function ShowModal : TModalResult;
    [color=red]procedure Hide;[/color]
  end;

procedure Register;

implementation
uses U_MySpecialForm; //Unit des Forms

procedure Register;
begin
  RegisterComponents('LS StandardForms', [TMyComponentForm]);
end;

Constructor TMyComponentForm.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
  FFenster := TMySpecialForm.Create(self);
end;

procedure TMyComponentForm.Show;
begin
  FFenster.Show;
end;

function [color=red]TMyComponentForm.[/color]ShowModal : TModalResult;
begin
  Result := FFenster.ShowModal;
end;

[color=red]procedure TMyComponentForm.Hide;
begin
  FFenster.Hide;
end;[/color]
Destructor TMyComponentForm.Destroy;
begin
  FreeAndNil(FFenster);
  inherited;
end;
Das ergibt mit wenig Arbeit eine Komponente, die ich auf meinem MainForm plaziere, und die das Form auf jeden Fall beim Beenden der Application wieder freigibt.

War sowas gesucht?
Gruß
(Rot = Edit)

jbg 26. Feb 2004 10:10

Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
 
Zitat:

Zitat von Leuselator
Das ergibt mit wenig Arbeit eine Komponente, die ich auf meinem MainForm plaziere, und die das Form auf jeden Fall beim Beenden der Application wieder freigibt.

Und ich vergebe einfach einen Owner beim Erzeugen, dann kümmert sich die VCL um die Freigabe beim Beenden bzw. wenn die Owner-Komponente freigegeben wird, werden alle "besessenen" Komponenten in einer Schleife in TComponent.Destroy freigegeben.

roderich 26. Feb 2004 10:47

Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
 
Zitat:

So. Habe es getestet. das:
Source:

procedure TForm1.Button2Click(Sender: TObject);
begin
NewFormNotModal := TForm2.Create(self);
NewFormNotModal.Show;
end;


hinterläßt ein Speicherleck. TForm.Close gibt also keinen Speicher frei.
Natürlich ist das kein Speicherleck, wieso sollte TForm.Close Speicher freigeben ???
Close setzt einfach nur Visible auf false, z.B. kann man dieses Form mit Show später wieder anzeigen.

Roderich

Hansa 26. Feb 2004 11:48

Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
 
Meine Testreihe ist beendet, mit folgendem Ergebnis :

close alleine gibt den Speicher nicht automatisch frei. Ebensowenig wie das :
Delphi-Quellcode:
Action := caFree;
im OnClose. Zusätzlich verzögert sich die Laufzeit schon bemerkbar. Setze ich ein free oder Destroy hinter das Create, so wurden bisher 1,1 Mio Forms erzeugt und wieder freigegeben. Die Laufzeit für jede erzeugte Form war gleich. Das ist nun Schade, denn das nützt mir nichts.

Ich deklariere die Forms nämlich so :

TMeineForm = class (TForm)
..

TDeineForm = class (TMeineForm)
..

usw.

dementsprechend erzeuge ich sie so :
Delphi-Quellcode:
procedure TMeineForm.lblDeineFormClick(Sender: TObject);
begin
  inherited;
  DeineForm:= TDeineForm.Create(self);
  DeineForm.Show;
end;
Hintergrund ist der, daß ich viele Eigenschaften schon in TMeineForm deklariere. Die Schriftart, einige Steuerelemente, einige Eigenschaften. Diese Form lege ich in das Repository/Objektablage und sage nicht neu -> Form, sonder neu -> weitere -> Inherited. Somit ist alles schon überall richtig und gleich eingestellt. Nun habe ich gestern ein Panel vergessen, das auf jede Form noch drauf mußte. Anstatt die ganzen Forms einzeln umzubauen, habe ich das auf MeineForm gelegt und dank OOP war es auf allen anderen Forms drauf.

Wenn ich nun aber die Forms dynamisch erzeuge, so bräuchte ich analog eine zentrale Stelle, um sie wieder zu entfernen. Leider geht das mit caFree im OnClose eben nicht.

Ich sehe gerade, daß ich weder Constructor noch destructor habe. :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:52 Uhr.
Seite 2 von 2     12   

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