Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Speicherleck nach Löschen des Parent??? (https://www.delphipraxis.net/191199-speicherleck-nach-loeschen-des-parent.html)

pesi 19. Dez 2016 14:28

Speicherleck nach Löschen des Parent???
 
Halli Hallo,

ich hätte da mal eine Frage: Ich erzeuge dynamisch TabSheets in einem TPageControl und packe auf die Sheets dann auch Elemente drauf (Memo, Label, etc.) deren Parent natürlich das jeweilige TabSheetX ist.

Muss ich, wenn die diese TabSheets nicht mehr benötige, alle einzelnen Elemente auf dem Sheet löschen oder reicht es mit TabSheet1.Destroy das Parent-Sheet platt zu machen??? Entsteht da irgendwelcher Datenmüll im Speicher?

Danke für Eure Einschätzung.

Gruß
Peter

nahpets 19. Dez 2016 14:33

AW: Speicherleck nach Löschen des Parent???
 
Schau mal bitte hier: http://delphi.about.com/od/adptips20...nilselfapp.htm
Eine englischsprachige Beschreibung zum Thema.

pesi 19. Dez 2016 15:18

AW: Speicherleck nach Löschen des Parent???
 
Da es in dem Artikel ja eher um Forms geht, hoffe ich, dass ich trotzdem das Wichtigste rausgelesen habe!?!?

"....the form is destroyed automatically when its owner is destroyed"

D.h. dann wohl, dass ich keinen Speichermüll erzeuge - richtig?

Sorry, bin ein eher simples Gemüt (oder nennen wir es "erfahrener Laie") :oops:

Danke Dir
Gruß
Peter

Der schöne Günther 19. Dez 2016 15:24

AW: Speicherleck nach Löschen des Parent???
 
Richtig- Wenn das Formular zerstört wird, zerstört es auch alle Dinge die ihm "gehören". Darunter auch dein TabSheet.

Ich würde dem TabSheet als Owner das PageControl geben, aber im Endeffekt macht das wohl keinen Unterschied.

Wenn du dich so um Speicherlecks sorgst, setze doch mal die Variable ReportMemoryLeaksOnShutdown auf
Delphi-Quellcode:
True
und schau selbst ;-)

nahpets 19. Dez 2016 15:35

AW: Speicherleck nach Löschen des Parent???
 
Im Artikel steht:
Zitat:

inherit from TControl
Also alles, was davon abgeleitet ist. Erklärt wird am Beispiel eines TForms.

Eigentlich gilt es für alles, was von TComponent abgeleitet wird.

Flappsig fomuliert: Alles, was man irgendwie auf ein Formular pappen kann.

Oder als einfacher Merker:

Sieht der Konstruktor so aus
Delphi-Quellcode:
constructor Create(AOwner: TComponent); override;
wird das Teil zusammen mit dem angegebenen Owner weggeräumt, sobald der weggeräumt wird.

pesi 19. Dez 2016 16:10

AW: Speicherleck nach Löschen des Parent???
 
Danke Euch!!!

:thumb: :thumb: :thumb:

freimatz 22. Dez 2016 16:14

AW: Speicherleck nach Löschen des Parent???
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1356599)
Ich würde dem TabSheet als Owner das PageControl geben, aber im Endeffekt macht das wohl keinen Unterschied.

Äh? durchaus macht das einen Unterschied:!: Parent <> Owner:!:

Der schöne Günther 22. Dez 2016 16:21

AW: Speicherleck nach Löschen des Parent???
 
Dass Parent und Owner nicht das gleiche ist habe ich verstanden.

Aber was macht das in diesem konkreten Fall für einen Unterschied? Er hat sein PageControl und fügt zur Laufzeit weitere Tabsheets hinzu. Mehr nicht.

Ohne weitere Angaben: Die Tabsheets werden zerstört wenn das Pagecontrol zerstört wird. Das Pagecontrol wird zerstört wenn sein Parent (Formular/Frame) zerstört wird. Also praktisch kein Unterschied.

nahpets 22. Dez 2016 16:29

AW: Speicherleck nach Löschen des Parent???
 
Wer aber ein Tabsheet als Parent hat und nicht als Owner, wird beim zerstören des Tabsheets bzw. des PageControls, nicht zerstört.

Wenn ich das hier richtig sehe, müssten die Frames sowohl als Parent, als auch als Owner, das entsprechende Tabsheet bekommen.

Wird das Tabsheet nicht zum Owner, bleibt das Frame beim entfernen des Tabsheet als Speicherloch erhalten ;-)

DeddyH 22. Dez 2016 17:46

AW: Speicherleck nach Löschen des Parent???
 
Auch der Parent gibt seine untergeordneten Controls frei. Ich weiß nicht, ob das schon immer so war, aber zumindest unter Delphi 7 findet sich in der Controls.pas im Destruktor von TWinControl:
Zitat:

Delphi-Quellcode:
  I := ControlCount;
  while I <> 0 do
  begin
    Instance := Controls[I - 1];
    Remove(Instance);
    Instance.Destroy;
    I := ControlCount;
  end;



Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr.
Seite 1 von 2  1 2      

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