![]() |
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:
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.
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; War sowas gesucht? Gruß (Rot = Edit) |
Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
Zitat:
|
Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
Zitat:
Close setzt einfach nur Visible auf false, z.B. kann man dieses Form mit Show später wieder anzeigen. Roderich |
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:
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.
Action := caFree;
Ich deklariere die Forms nämlich so : TMeineForm = class (TForm) .. TDeineForm = class (TMeineForm) .. usw. dementsprechend erzeuge ich sie so :
Delphi-Quellcode:
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.
procedure TMeineForm.lblDeineFormClick(Sender: TObject);
begin inherited; DeineForm:= TDeineForm.Create(self); DeineForm.Show; end; 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 01:53 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