AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von madbrain · begonnen am 7. Okt 2003 · letzter Beitrag vom 8. Okt 2003
Antwort Antwort
madbrain

Registriert seit: 9. Aug 2003
Ort: an der Elbe
20 Beiträge
 
Delphi 7 Enterprise
 
#1

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

  Alt 7. Okt 2003, 10:58
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,

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]
madbrain


Hab kein INet
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#2

Re: with TObject.Create() do ... freigeben ?

  Alt 7. Okt 2003, 11:05
Wie wärs mir:
Delphi-Quellcode:
with TObject.Create() do
begin
 ...
  Free;
end;
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#3

Re: with TObject.Create() do ... freigeben ?

  Alt 7. Okt 2003, 11:06
Delphi-Quellcode:
with TObject.Create() do
  try
  finally
    Free;
  end;
Damit es auch im fehlerfall freigegeben wird.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: with TObject.Create() do ... freigeben ?

  Alt 7. Okt 2003, 11:13
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: with TObject.Create() do ... freigeben ?

  Alt 7. Okt 2003, 12:51
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
madbrain

Registriert seit: 9. Aug 2003
Ort: an der Elbe
20 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: with TObject.Create() do ... freigeben ?

  Alt 7. Okt 2003, 15:50
@ Christian Seehase:
Jo, das war sowas. Danke!


@ Robert Marquardt:
Zur Geschwindigkeitssteigerung: 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.
madbrain


Hab kein INet
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: with TObject.Create() do ... freigeben ?

  Alt 7. Okt 2003, 16:41
Moin Madbrain,

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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#8

Re: with TObject.Create() do ... freigeben ?

  Alt 8. Okt 2003, 07:05
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:55 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