AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi prüfen, ob dyn. zur Runtime erzeugte Form Speicher freigibt?

prüfen, ob dyn. zur Runtime erzeugte Form Speicher freigibt?

Ein Thema von Hansa · begonnen am 26. Feb 2004 · letzter Beitrag vom 26. Feb 2004
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#11

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

  Alt 26. Feb 2004, 02:54
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)
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.479 Beiträge
 
Delphi 10.1 Berlin Professional
 
#12

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

  Alt 26. Feb 2004, 11:10
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.
  Mit Zitat antworten Zitat
roderich
(Gast)

n/a Beiträge
 
#13

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

  Alt 26. Feb 2004, 11:47
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#14

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

  Alt 26. Feb 2004, 12:48
Meine Testreihe ist beendet, mit folgendem Ergebnis :

close alleine gibt den Speicher nicht automatisch frei. Ebensowenig wie das :
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 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