Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi with TObject.Create() do ... freigeben ? (https://www.delphipraxis.net/9890-tobject-create-do-freigeben.html)

madbrain 7. Okt 2003 10:58


with TObject.Create() do ... freigeben ?
 
Moin!

Hab letztens in etwa folgenden Source gesehen:
Delphi-Quellcode:
with TObject.Create() do
begin
 ...
end;
(Es war nicht TObject sondern irgend wein andere Typ)

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]

FriFra 7. Okt 2003 11:05

Re: with TObject.Create() do ... freigeben ?
 
Wie wärs mir:
Delphi-Quellcode:
with TObject.Create() do
begin
 ...
  Free;
end;
:wink:

neolithos 7. Okt 2003 11:06

Re: with TObject.Create() do ... freigeben ?
 
Delphi-Quellcode:
with TObject.Create() do
  try
  finally
    Free;
  end;
Damit es auch im fehlerfall freigegeben wird.

Robert Marquardt 7. Okt 2003 11:13

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.

Christian Seehase 7. Okt 2003 12:51

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.

madbrain 7. Okt 2003 15:50

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.

Christian Seehase 7. Okt 2003 16:41

Re: with TObject.Create() do ... freigeben ?
 
Moin Madbrain,

Zitat:

Zitat von madbrain
Eine Prozedur FreeAllObjectsWithoutName() z.B. die alle namenlosen Objekte freigibt, wäre ganz praktisch.

das könntest Du mit Objekten machen, die von TComponent abstammen, und bei denen Owner <> nil ist, indem Du durch das Array of Components des Owner durchgehst, und alle bei denen der Name = '' ist, free aufrufst.

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;

Robert Marquardt 8. Okt 2003 07:05

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 01:15 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