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 TComponentList: Nur zur Laufzeit erstelle Kompos löschen (https://www.delphipraxis.net/118551-tcomponentlist-nur-zur-laufzeit-erstelle-kompos-loeschen.html)

Helmi 10. Aug 2008 08:54


TComponentList: Nur zur Laufzeit erstelle Kompos löschen
 
Hallo,

ich hab eine Komponentenliste vom Typ TComponentList in der ich zur Laufzeit
erzeugte Komponenten als auch schon zur Designzeit erzeugte Komponenten
eintrage.

Am Ende des Programmes bei OnDestroy der Form will ich alle zur Laufzeit erstellten
Komponenten löschen.

Dafür hab ich folgenden Code:
Delphi-Quellcode:
procedure TMaskForm.FormDestroy(Sender: TObject);
var
  i: Integer;
  Dummy_Kompo: TComponent;

begin
  for i := Pred(Komponentenliste.Count) downto 0 do
    begin
      //Komponente auslesen
      Dummy_Kompo := Komponentenliste.Items[i];

      If Assigned(Dummy_Kompo) then
        FreeAndNil(Dummy_Kompo);
    end;

  FreeAndNil(Komponentenliste);
end;
Mit dem Assigned will ich alle Komponenten die beim Design erstellt wurden,
aussieben.
Aber leider bekomm ich immer eine AccessViolation - ich weiss nur nicht warum?

mkinzler 10. Aug 2008 09:09

Re: TComponentList: Nur zur Laufzeit erstelle Kompos löschen
 
Warum willst du nur manuell erzeugte Löschen?

Helmi 10. Aug 2008 09:29

Re: TComponentList: Nur zur Laufzeit erstelle Kompos löschen
 
Zitat:

Zitat von mkinzler
Warum willst du nur manuell erzeugte Löschen?

Genau andersrum - ich will alle zur Laufzeit erzeugte löschen

SirThornberry 10. Aug 2008 09:35

Re: TComponentList: Nur zur Laufzeit erstelle Kompos löschen
 
Wäre es nicht das einfachste die zur Laufzeit erzeugten in eine Extra Liste zu packen?
So wie du es vor hast geht es nicht. Assigned ist nichts anderes als auf eine Prüfung auf ungleich nil. Wenn eine Komponente frei gegeben wird, wird aber nicht automatisch dein Pointer auf die Instanz auf nil gesetzt sondern zeigt weiterhin auf den Speicher. Entsprechend funktioniert die Prüfung nicht.

Jelly 10. Aug 2008 09:35

Re: TComponentList: Nur zur Laufzeit erstelle Kompos löschen
 
Zitat:

Zitat von Helmi
Zitat:

Zitat von mkinzler
Warum willst du nur manuell erzeugte Löschen?

Genau andersrum - ich will alle zur Laufzeit erzeugte löschen

Die Frage von mkinzler ist berechtigt. Alle Komponenten, die irgendwie im Fenster liegen und das Fenster selbst als Owner besitzen (Eigenschaft der Komponente), werden beim Zerstören des Fensters gleich mit freigegeben. Ein manuelles FreeAndNil erübrigt sich somit eigentlich ganz von selbst.

Helmi 10. Aug 2008 09:41

Re: TComponentList: Nur zur Laufzeit erstelle Kompos löschen
 
Zitat:

Zitat von Jelly
Die Frage von mkinzler ist berechtigt. Alle Komponenten, die irgendwie im Fenster liegen und das Fenster selbst als Owner besitzen (Eigenschaft der Komponente), werden beim Zerstören des Fensters gleich mit freigegeben. Ein manuelles FreeAndNil erübrigt sich somit eigentlich ganz von selbst.

mmmh - irgendwie hast du recht
ich hab ja alle Kompos auf einem Panel

mkinzler 10. Aug 2008 09:42

Re: TComponentList: Nur zur Laufzeit erstelle Kompos löschen
 
Zudem sind zur Laufzeit erzeugte manuell erzeugte Komponenten

Helmi 10. Aug 2008 09:46

Re: TComponentList: Nur zur Laufzeit erstelle Kompos löschen
 
Eine Frage hätt ich aber noch dazu:

ich erzeug die Kompoentenliste im OnCreate der Form mit:
Delphi-Quellcode:
  //Komponentenliste erzeugen
  Komponentenliste         := TComponentlist.Create;
im OnDestroy gib ich sie wieder frei:
Delphi-Quellcode:
FreeAndNil(Komponentenliste)
Nur bekomm ich dabei eine AV.

Ich hab mal gelernt, mann müsse alles was man erzeugt auch wieder
freigeben, das tu ich ja, aber trotzdem die AV?

mkinzler 10. Aug 2008 09:50

Re: TComponentList: Nur zur Laufzeit erstelle Kompos löschen
 
Wenn du manuell freigeben willst, mussst du alle freigeben und vorher aus der Liste nehmen

Jelly 10. Aug 2008 09:56

Re: TComponentList: Nur zur Laufzeit erstelle Kompos löschen
 
Eine TComponentList gibt alle enthaltenen Objekte mit frei, wenn du die Liste selbst freigibst... Machs dir doch nicht so kompliziert. (siehe dazu auch Doku zu Delphi)


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