![]() |
with TObject.Create() do ... freigeben ?
Moin!
Hab letztens in etwa folgenden Source gesehen:
Delphi-Quellcode:
(Es war nicht TObject sondern irgend wein andere Typ)
with TObject.Create() do
begin ... end; Habs auch getestet und mich gewundert dass es tatsächlich funktioniert. Aber mir ist der Sinn nicht ganz klar, :wiejetzt: denn Ich hab dann zwar ein Objekt, aber keine Variable die darauf zeigt. Wie kann ich so erzeugte Objekte wieder freigeben ? Geht das überhaupt ? Wenn ja, wie ? :?: [edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit] |
Re: with TObject.Create() do ... freigeben ?
Wie wärs mir:
Delphi-Quellcode:
:wink:
with TObject.Create() do
begin ... Free; end; |
Re: with TObject.Create() do ... freigeben ?
Delphi-Quellcode:
Damit es auch im fehlerfall freigegeben wird.
with TObject.Create() do
try finally Free; end; |
Re: with TObject.Create() do ... freigeben ?
Letztlich richtet with einfach eine (oder mehrere) anonyme Variablen ein.
Besonders bei verschachtelten COM-Objekten sollte man with einsetzen. Wenn also das COM-Objekt seinerseits ein COM-Objekt liefert (oder tiefer verschachtelt). Der Vorteil ist eine deutliche Geschwindigkeitssteigerung. Ein Zugriff ComObj.ComProperty.ComComProperty.ComComProperty bewirkt eine mehrfache COM-Namensaufloesung. with ComObj.ComProperty.ComComProperty do spart drei der Namensaufloesungen. |
Re: with TObject.Create() do ... freigeben ?
Moin Madbrain,
sollte es sich da um etwas gehandelt haben, bei dem ein Owner mit angegeben wird (<> nil), so muss man sich nicht selber um die Freigabe kümmern, da dieses Objekt dann freigegeben wird, wenn der Owner zerstört wird. |
Re: with TObject.Create() do ... freigeben ?
@ Christian Seehase:
Jo, das war sowas. Danke! :hello: @ Robert Marquardt: Zur Geschwindigkeitssteigerung: :warn: Beziehst du dich jetzt auf die "allgemeine" with..do-anweisung ( z.b. with Objekt1.SubObjekt do) oder auf die "spezielle" (with TObject.Create do ) also die ohne Variable? Das es bei der allgemeinen eine bessere Performance gibt, ist mir bekannt. Gibt es bei der "speziellen" eine weitere Performance-Verbesserung? @ all: Ok, dass ich es so freigeben kann, ist mir klar. Aber die meisten Objekte benutzt man doch über einen längeren "Zeitraum" als ein paar Zeilen. Meine Frage war, ob es eine möglichkeit gibt nach der with..do anweisung noch auf diese "variablenlosen" objekte zuzugreifen. Eine Prozedur FreeAllObjectsWithoutName() z.B. die alle namenlosen Objekte freigibt, wäre ganz praktisch. |
Re: with TObject.Create() do ... freigeben ?
Moin Madbrain,
Zitat:
Beispiel:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin with TLabel.Create(Form1) do begin caption := 'TEST'; parent := Form1; end; end; procedure TForm1.Button3Click(Sender: TObject); var i : integer; tc : TComponent; begin for i := ComponentCount-1 downto 0 do begin tc := Components[i]; if tc.Name = '' then tc.Free; end; end; |
Re: with TObject.Create() do ... freigeben ?
Die Geschwindigkeitssteigerung ist nur bei ActiveX/COM-Objekten spuerbar, da nur dort die Aufloesung von . wirklich aufwendig ist. Da kann durchaus pro Auswertung ein Prozesswechsel stattfinden.
Bei normalen Objekten dient with mehr der Vermeidung der Schreibarbeit. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 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