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 laufzeit-komponenten-array freigeben (https://www.delphipraxis.net/36518-laufzeit-komponenten-array-freigeben.html)

LoL 21. Dez 2004 09:04


laufzeit-komponenten-array freigeben
 
hi

ich habe zur laufzeit ein array mit komponenten erstellt (in meinem fall mit tabsheets)
Delphi-Quellcode:
for i := 0 to 3 do
  begin
    SetLength(ts_graphen, succ(i));
    tabsheet[i] := TTabSheet.Create(pagecontrol);
    tabsheet[i].PageControl := pagecontrol;
  end;
jetzt möchte gerne folgendes wissen
1. ist der speicher der die 4 tabsheets belegen freigegeben und =NIL wenn ich nur das pagecontrol lösche?
2. wie kann ich die einzelnen tabsheets oder auch allg. die komponenten des arrays einzeln selbst freigeben?

ich dachte so
Delphi-Quellcode:
for i := 0 to 3 do
  begin
    tabsheet[i].Free;
    tabsheet := nil;
  end;
funktioniert auch aber nur beim ersten beim 2. bekomme ich ne exception!

Steve 21. Dez 2004 09:06

Re: laufzeit-komponenten-array freigeben
 
Hi,

Versuchs mal so:
Delphi-Quellcode:
for i := 3 downto 0 do
  begin
    FreeAndNil(tabsheet[0]);
  end;
Gruß
Stephan :dance: :xmas:

LoL 21. Dez 2004 09:12

Re: laufzeit-komponenten-array freigeben
 
nein ich bin doof :wall: :wall: :wall:
so gehts natürlich auch

Delphi-Quellcode:
for i := 0 to 3 do
  begin
    tabsheet[i].Free;
    tabsheet[i] := nil;
  end;

Luckie 21. Dez 2004 09:43

Re: laufzeit-komponenten-array freigeben
 
zu 1.: Ja ist er. In der Create Methode gibst du den Owner an und der ist für den Speicher verantwortlich. Gibst du den Owner frei, wird auch automatisch der Speicher dessen Child Kontrols freigegeben.

Stevie 21. Dez 2004 10:54

Re: laufzeit-komponenten-array freigeben
 
Wenn man schon OOP betreibt, dann bitte richtig! :roll: :wink:
Es gibt ein Klasse, das nennt sich TObjectList.
Zitat:

Zitat von Die Delphi-Hilfe
Mit TObjectList können Sie eine Liste von Objekten speichern und verwalten. Die Komponente stellt Eigenschaften und Methoden für das Hinzufügen, Löschen, Umsortieren, Suchen, Zugreifen und Sortieren von Objekten zur Verfügung. Ist die Eigenschaft OwnsObjects auf True gesetzt (Voreinstellung), verwaltet TObjectList den Speicher seiner Objekte, das heißt, ein Objekt wird freigegeben, wenn sein Index neu zugewiesen wird, wenn es mit der Methode Delete, Remove oder Clear aus der Liste entfernt wird oder wenn die Instanz TObjectList selbst aufgelöst wird.


Christian Seehase 21. Dez 2004 12:50

Re: laufzeit-komponenten-array freigeben
 
Moin Christoph,

SetLength solltest Du nicht in der Schleife aufrufen, sondern das Array, möglichst, gleich auf die erforderliche Grösse bringen, da hier jedesmal Speicher neu angefordert, und der alte Inhalt auf den neuen Platz kopiert wird. Das geht auf die Performance.

Warum dimensionierst Du eigentlich ein Array Namens ts_graphen, und weist dann einem Array TabSheets die Werte zu :gruebel:

Helmi 21. Dez 2004 13:06

Re: laufzeit-komponenten-array freigeben
 
Hallo,

zu diesem Thema hätt ich auch eine Frage.
Dieses passt auch zu diesem Thread - deshalb mach ich mal keinen neuen Thread auf.

Also:

Ich beschreibe im OnCreate folgendes Array:

Code:
  for i := 1 to length(UpdateIcons) do
    UpdateIcons[i] := TIcon.Create;
und gib dieses Array im OnDestroy wieder frei, nämlich so:

Code:
  FreeAndNil(UpdateIcons);
Reicht das zum Freigeben oder muss ich jedes Array-Element (oder wie man das bezeichen soll) in einer Schleife explizit freigeben?

etwa so:
Code:
  for i := 1 to length(UpdateIcons) do
    FreeAndNil(UpdateIcons[i]);
mfg
Helmi

Christian Seehase 21. Dez 2004 13:08

Re: laufzeit-komponenten-array freigeben
 
Moin Helmi,

kurze Frage:

Zitat:

Zitat von Helmi
oder muss ich jedes Array-Element ... in einer Schleife explizit freigeben?

kurze Antwort:
Ja, musst Du.

Stevie 21. Dez 2004 13:09

Re: laufzeit-komponenten-array freigeben
 
Letzteres, denn das Array selber enthält ja nur nen Pointer auf deine Objekte und weiß ja nicht, dass es diese auch löschen soll.

Helmi 21. Dez 2004 13:10

Re: laufzeit-komponenten-array freigeben
 
mmmpf :(

na gut - dann muss ich das so freigeben

trotzdem Danke :-D


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