![]() |
Eltern haften für ihre Kinder (dynamisch erstellte Controls)
In diesem Topic geht es um das Freigeben von zur Laufzeit dynamisch erstellter Controls. Sind die Eltern (Parent/Owner) für ihre Kinder (Child/Controls) verantwortlich?
Wird zum Beispiel ein TButton zur Laufzeit erstellt, so wird ihm unter anderem ein Owner zugewiesen.
Delphi-Quellcode:
In einigen Tutorials wird gesagt, man solle zur Laufzeit erstellte Controls selbst wieder freigeben.
MyButton := TButton.Create(self); // Owner zuweisen
MyButton.Parent := self; // Parent zuweisen ... Beispiel: ![]() Die OnlineHilfe sagt zum Thema Owner: Zitat:
Anders gefragt: Werden dynamisch erzeugte Controls bei Programmende automatisch im Speicher freigegeben? Guido. |
Re: Eltern haften für ihre Kinder (dynamisch erstellte Contr
Eines der schönen Dinge an der VCL ist das standardisierte lifetime management.
Wenn der Owner freigeben wird, wird er wiederum alle seine Components[X] freigeben. Zitat:
Wenn du dynamisch ein Panel anlegst, 5 Controls drauf wirfst und vllt noch eine Komponente, willst du sie nicht alle aus dem Speicher entfernen, wenn du sie nicht mehr brauchst? Was in der UI dynamisch angelegt wird, wird höchstwahrscheinlich auch wieder entfernt. Wenn du nun allen Controls und der Komponente das Panel als Owner verpasst, musst du nur noch dieses freigeben. :) Oder wenn du nach MVC vorgehst, würdest du den Controller für dieses Panel/Frame als Komponente implementieren. So musst du nur ihn freigeben um auch die von ihm verwalteten Controls freizugeben. btw: Du bist nicht zufällig der Bösewicht aus Darkwing Duck? :mrgreen: |
Re: Eltern haften für ihre Kinder (dynamisch erstellte Contr
Natürlich kannst du das Freigeben dem Owner überlassen. Nachteil ist das du dir das ganz schnell angewöhnst. Und dann erzeugst du irgendwann eine Stringliste (die nicht von TComponente abgeleitet ist) und vergisst diese freizugeben weil du es schon gewohnt bist das du nix mehr freigeben muss.
Es schadet nicht Componenten explizit freizugeben, es erhöht die Übersichtlichkeit wenn man nach einem Speicherleck sucht. |
Re: Eltern haften für ihre Kinder (dynamisch erstellte Ctrls
Hallo Jens.
Zitat:
Zitat:
Delphi nimmt einem zwar vieles an Arbeit ab, aber dennoch ist der Programmierer für sauberen Code verantwortlich. Zitat:
Vielen Dank für den Beitrag. Weiter Infos/Hintergründe sind willkommen, gleich ob jemand wiederspricht oder zustimmt. Gruß, Guido. |
Re: Eltern haften für ihre Kinder (dynamisch erstellte Contr
Hallo Robert.
Sorry, ich war irgendwie blind :shock: und hab doch glatt deinen Beitrag übersehen. :oops: Zitat:
Zitat:
Zitat:
Zitat:
Den Gedanken finde ich interessant, dass man (wenn möglich) dynamisch erzeugte Controls in ein Panel setzt und dann nur dieses Panel freigeben muss! Zitat:
PS: Habe gerade gesehen, dass du kurz vor deinem Tausendsten Beitrag bist! (998, falls du nicht inzwischen weiter geschrieben hast.) Wenn der Zähler umspringt, wird gefeiert! :cheers: :party: Gruß, Guido. Edit: MVC habe ich herausgefunden -> ![]() |
Re: Eltern haften für ihre Kinder (dynamisch erstellte Contr
Wende doch den alten Stringgrid-Objects-Trick sinngemäß an. Beim Erzeugen Variable hochzählen und beim Destroy usw. das ganze wieder runterzählen. Ist die Zahl am Ende anders als am Anfang, dann kann während der Laufzeit des Programmes irgendwas schiefgehen. :P Wichtig wäre da noch, die Sichtbarkeit möglichst gering zu halten.
|
Re: Eltern haften für ihre Kinder (dynamisch erstellte Contr
@Guido: Und UI steht schlicht für User Interface :mrgreen:
|
Re: Eltern haften für ihre Kinder (dynamisch erstellte Contr
Zitat:
Zitat:
Gehe immer davon aus, dass du etwas einfach wieder entladen/freigeben können musst. Früher oder später wirst du es bei einigen Dingsens müssen. Zitat:
Wenn du dynamisch einen Graph von Komponenten erzeugst, könntest du das eigentlich auch so machen:
Delphi-Quellcode:
Da der Owner die Lebenszeit seiner Kinderchens verwaltet, bringt er sie einfach um, wenn er selbst sterben muss. Ergo: nur ein hässlicher try-finally-Block notwendig.
var
kompo1 : TKompo1; kompo2 : TKompo2; kompo3 : TKompo3; begin kompo1 := TKompo1.Create(nil); try kompo2 := TKompo2.Create(kompo1); kompo3 := TKompo3.Create(kompo1); ... finally kompo1.Free(); end; Zitat:
Zitat:
|
Re: Eltern haften für ihre Kinder (dynamisch erstellte Contr
@Hansa
Ey, ä Saabregga! :thumb: Zitat:
Was meinst du mit "Sichtbarkeit möglichst gering halten" ? @Ronny Zitat:
@Robert Beitrag übersehen: Ich habe jetzt auch bemerkt, dass die "Forumsdynamik" ihren Teil dazu beigetragen hat. Auch wenn mehrere Antworten auf einen Beitrag geschrieben werden, wird nur eine Mitteilung vom Forum geschickt (bis man das Thema wieder besucht). Ein Klick im Mail-Client scrollt dann die Topic-Seite schön bis zum letzten Beitrag ... und schwups ist der oberdrüber unsichtbar. Zitat:
Zitat:
Zitat:
So, genug geschwatzt! Ich muss jetzt Schluss machen, Kiki ruft! :-D Danke an alle! Guido |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz