Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi dynamische erstellte Komponenten wieder freigeben? (https://www.delphipraxis.net/85484-dynamische-erstellte-komponenten-wieder-freigeben.html)

schuetzejanett 31. Jan 2007 13:50


dynamische erstellte Komponenten wieder freigeben?
 
Hallo,

erstelle mir während der Laufzeit eine bestimmte Menge Komponenten z.b Labels, Buttons dynamisch die ich in einem dynamischen array des jeweiligen Typs speicher.
Muss ich beim destruktor der form die einzelnen komponenten alle einzeln lösche oder reicht es wenn ich das array lösche
also z.b.

Delphi-Quellcode:
 freeandNil(apanel);
odedr löscht delphi automatisch alle komponenten der form beim destroy.

SirThornberry 31. Jan 2007 14:05

Re: dynamische erstellte Komponenten wieder freigeben?
 
Es ist besser wenn du die Komponenten manuell frei gibst. Im Moment wird dein Programm zwar vermutlich mit dem Schließen der Form beendet aber wenn du irgendwann das ganze mal umbaust und dein Programm weiter läuft hast du ein Speicherleck. Also lieber gleich machen. Zudem gilt eigentlich immer (im Sinne von sauberem Programmierstil) - Speicher den man selbst anfordert gibt man auch selbst wieder frei.

Muetze1 31. Jan 2007 14:07

Re: dynamische erstellte Komponenten wieder freigeben?
 
Ein FreeAndNil() lässt sich zwar mit einem dynamischen Array aufrufen, aber es ist nicht gewollt geschweige denn ansatzweise gesund. Ein dynamisches Array wird entweder durch die Zuweisung von Nil auf 0 reduziert oder du rufst SetLength() mit einer Länge mit 0 auf. FreeAndNil() ist nur für Instanzen gedacht.

TStringlist 31. Jan 2007 18:12

Re: dynamische erstellte Komponenten wieder freigeben?
 
Wenn Du bei der dynamischen Erzeugung dieser Komponenten jeweils die Form als Owner mit angegeben hast, dann brauchst Du keine von diesen Komponenten mehr extra zu destroyen. Das macht dann nämlich ein solcher Eigentümer immer automatisch mit.

Ansonsten, eine solche dynamische Array (wie deine), dient immer nur alleine einer Aufbewahrung von ein paar Zeigern (auf diese anderen Objekte) und hat mit derem Löschen absolut gar nichts zu tun.

Übrigens hätte man anstelle einer solchen dynamischen Array dann auch gleich eine Instanz von TObjectList nehmen können. Die hat nämlich eine Eigenschaft (neben einigen anderen praktischen), die, wenn sie TRUE ist, dafür sorgt, dass beim Löschen der Objektliste dann auch alle in ihr eingetragenen Objekte mit destroyed werden (..welche man in dem Fall dann natürlich wiederum ohne einen Owner erzeugt hat).

Christian Seehase 31. Jan 2007 18:57

Re: dynamische erstellte Komponenten wieder freigeben?
 
Moin Janett,

als Ergänzung zu TStringLists Aussage:
Der Owner muss nicht zwingend das Formular sein, auf dem die Komponenten liegen, auch wenn das wohl meist sinnvoll ist.
Jeder beliebige Nachkomme von TComponent würde es auch tun, solange sichergestellt ist, dass dieser wieder freigegeben wird.

Da TComponent ein eigenes Array mit Komponenten verwaltet, ist es auch fraglich, ob Du das eigene Array dann überhaupt brauchst, aber das hängt auch davon ab, wofür Du es verwendest.

Robert Marquardt 31. Jan 2007 19:22

Re: dynamische erstellte Komponenten wieder freigeben?
 
Zitat:

Zitat von Muetze1
Ein FreeAndNil() lässt sich zwar mit einem dynamischen Array aufrufen, aber es ist nicht gewollt geschweige denn ansatzweise gesund. Ein dynamisches Array wird entweder durch die Zuweisung von Nil auf 0 reduziert oder du rufst SetLength() mit einer Länge mit 0 auf. FreeAndNil() ist nur für Instanzen gedacht.

Um ein dynamische Array muss man sich garnicht kuemmern. Da verwaltet Delphi die Freigabe selber.
Die im Array abgelegten Komponenten muss man nur freigeben wenn man sie ohne Owner erzeugt hat. Der Owner einer Komponente ist fuer die Freigabe zustaendig.
Man kann sie natuerlich trotzdem freigeben. Ueber den Mechanismus der Methode Notification wird dann der Owner benachrichtigt so das er die Komponente aus der Liste seiner verwalteten Komponenten herausnimmt.

xZise 31. Jan 2007 19:28

Re: dynamische erstellte Komponenten wieder freigeben?
 
Also die Frage von schuetzejanett habe ich mir auch schon gestellt, ob es möglich ist, alle Arrayitems mit einem Befehl freizugeben...

Hansa 31. Jan 2007 19:47

Re: dynamische erstellte Komponenten wieder freigeben?
 
Sofern die Steuerelemente auf einer Form liegen, sollte man diese im FormClose mit Closeaction caFree einfach freigeben und fertig.

Hawkeye219 31. Jan 2007 20:45

Re: dynamische erstellte Komponenten wieder freigeben?
 
Hallo,

ich würde zum Speichern der Referenzen eine Delphi-Referenz durchsuchenTComponentList verwenden. Sie wird über freigegebene Komponenten benachrichtigt und kann somit die ungültig gewordenen Zeiger automatisch entfernen. Damit führt auch die (vorzeitige) Zerstörung eines TWinControls mit enthaltenen Komponenten nicht zu einer Schutzverletzung am Programmende. Der einzige Nachteil gegenüber dem dynamischen Array ist der notwendige TypeCast beim Verwenden der Referenzen.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 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