Autor |
Beitrag |
galagher
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 12.10.20 17:16
Hallo!
Ich erzeuge zur Laufzeit mehrere Komponenten auf einer ScrollBox, deren Parent jeweils diese ScrollBox ist.
Muss ich beim Beenden des Programms alle diese Komponenten mit .Free zerstören oder wird das automatisch erledigt? Da die Komponenten die ScollBox als Parent haben, muss ich sie natürlich nicht freigeben, oder? Ich bin mir da nicht so ganz sicher! !?: Moderiert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 12.10.2020 um 21:50
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
Beiträge: 19272
Erhaltene Danke: 1740
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 12.10.20 18:54
galagher hat folgendes geschrieben : | Muss ich beim Beenden des Programms alle diese Komponenten mit .Free zerstören oder wird das automatisch erledigt? Da die Komponenten die ScollBox als Parent haben, muss ich sie natürlich nicht freigeben, oder? Ich bin mir da nicht so ganz sicher! |
Du verwechselst gerade Parent und Owner. Parent ist die Fläche, auf der das Control liegt. Owner ist der Besitzer, der sich dann auch um die Freigabe kümmert. Wenn du eine Komponente mit ....Create(ScrollBox) erzeugst, sprich die Scrollbox als Owner dem Konstruktor übergibst, gehören sie der Scrollbox und eine manuelle Freigabe ist nicht erforderlich.
|
|
galagher
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 12.10.20 19:51
jaenicke hat folgendes geschrieben : | Du verwechselst gerade Parent und Owner. Parent ist die Fläche, auf der das Control liegt. Owner ist der Besitzer, der sich dann auch um die Freigabe kümmert. Wenn du eine Komponente mit ....Create(ScrollBox) erzeugst, sprich die Scrollbox als Owner dem Konstruktor übergibst, gehören sie der Scrollbox und eine manuelle Freigabe ist nicht erforderlich. |
Ich mache das so:
Delphi-Quelltext 1: 2:
| LabeledImage := TLabeledImage.Create(Self); LabeledImage.Parent := ScrollBox1; |
Also gehören sie damit der Scrollbox, eine manuelle Freigabe ist damit überflüssig? Sehe ich das richtig?
Edit:
Bzw. gehören sie mit Create(Self) dem Formular und eine manuelle Freigabe ist ebenfalls nicht erforderlich? Oder?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Gausi
Beiträge: 8535
Erhaltene Danke: 473
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 12.10.20 20:03
Wenn die beiden Zeilen innerhalb einer Methode der Form stehen, und sich das self somit auf eine TForm bezieht, dann wird das LabeledImage beim freigeben der Form auch freigegeben.
Du muss also nichts weiter tun.
TLabeledImage.Create(ScrollBox1) wäre ggf. sinnvoller, wenn auch die Scrollbox dynamisch erstellt wird und im Verlauf des Programms freigegeben soll - inklusiver aller Komponenten in der Scrollbox. Aber wenn beides bis zum Ende des Programms bleiben soll, dann ist es relativ egal, wer der Owner ist.
_________________ We are, we were and will not be.
|
|
galagher
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 12.10.20 20:16
Gausi hat folgendes geschrieben : | Wenn die beiden Zeilen innerhalb einer Methode der Form stehen, und sich das self somit auf eine TForm bezieht, dann wird das LabeledImage beim freigeben der Form auch freigegeben. |
Ja, sie stehen in procedure TForm1.CreateLabeledImages([...]);
Gausi hat folgendes geschrieben : | TLabeledImage.Create(ScrollBox1) wäre ggf. sinnvoller, wenn auch die Scrollbox dynamisch erstellt wird und im Verlauf des Programms freigegeben soll - inklusiver aller Komponenten in der Scrollbox. Aber wenn beides bis zum Ende des Programms bleiben soll, dann ist es relativ egal, wer der Owner ist. |
Ich muss zur Laufzeit nur die TLabeledImage's freigeben, weil sie beim Einlesen einer Datei jeweils neu erzeugt werden müssen. Klappt auch problemlos. Die ScrollBox bleibt während der gesamtem Laufzeit des Programms bestehen.
Wenn ich TLabeledImage.Create(ScrollBox1) angebe, führt dies sofort zu einem Fehler:
Zitat: | Komponente mit der Bezeichnung LabeledImage0 existiert bereits. |
Oder, an anderer Stelle:
Zitat: | Zugriffsverletzung bei Adresse 0069A6FC in Modul 'FotoSort.exe'. Lesen von Adresse 000001C8. |
Also belasse ich es bei TLabeledImage.Create(Self) und LabeledImage.Parent := ScrollBox1 (Self ist TForm1) und gut?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
Beiträge: 19272
Erhaltene Danke: 1740
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 23.11.20 15:32
galagher hat folgendes geschrieben : | Zitat: | Komponente mit der Bezeichnung LabeledImage0 existiert bereits. |
|
Wir vergeben schlicht auch einen Namen für die erstellten Komponenten um den Fehler zu vermeiden. Bei uns werden aber auch Teile der Komponenten wieder zwischendurch entfernt, so dass wir den korrekten Owner haben möchten.
|
|
|