Delphi-PRAXiS
Seite 5 von 6   « Erste     345 6      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Jedi VCL und Delphi Turbo Exp. (https://www.delphipraxis.net/76591-jedi-vcl-und-delphi-turbo-exp.html)

Achim Kalwa 10. Sep 2006 11:22

Re: Jedi VCL und Delphi Turbo Exp.
 
Zitat:

Zitat von DevilsCamp
Delphi-Quellcode:
procedure Form1Create(Sender: TObject);
begin
  NTListbox1 := TNTListbox.Create(Self); // oder entsprechende andere Komponente statt Self;
  NTListbox1.Parent := Self; // wie oben
 
  // Nun alle weiteren Properties setzen:
  // Width, Height, Left, Top, usw.
end;

procedure Form1Close(Sender: TObject);
begin
  NTListbox1.Free;
end;
Ensprechend für jede weitere Komponente, die nun nicht mehr per OI eingerichtet werden kann.

NTListbox1.Free ist ein böser Fehler!
Du hast die Komponente bereits der Verwaltung des Forms übergeben, also kümmert sich das Form auch um die Freigabe der Komponente.

Achim

TeronG 11. Sep 2006 09:30

Re: Jedi VCL und Delphi Turbo Exp.
 
Echt? :gruebel:
Aber .Free schaut ja eh erst, ob was da is :wink: (so weit ich weis)

DevilsCamp 11. Sep 2006 09:34

Re: Jedi VCL und Delphi Turbo Exp.
 
[quote="kalwados"]
Zitat:

Zitat von DevilsCamp
NTListbox1.Free ist ein böser Fehler!
Du hast die Komponente bereits der Verwaltung des Forms übergeben, also kümmert sich das Form auch um die Freigabe der Komponente.

Achim

hmm, bisher habe ich das immer gemacht und keine Probleme dabei bekommen.

uligerhardt 11. Sep 2006 09:43

Re: Jedi VCL und Delphi Turbo Exp.
 
[quote="DevilsCamp"]
Zitat:

Zitat von kalwados
Zitat:

Zitat von DevilsCamp
NTListbox1.Free ist ein böser Fehler!
Du hast die Komponente bereits der Verwaltung des Forms übergeben, also kümmert sich das Form auch um die Freigabe der Komponente.

Achim

hmm, bisher habe ich das immer gemacht und keine Probleme dabei bekommen.

Jo, weil sich TComponents im Destruktor beim Owner abmelden. Das Free ist also doppelt gemoppelt, aber unschädlich.

mkinzler 11. Sep 2006 09:51

Re: Jedi VCL und Delphi Turbo Exp.
 
Zitat:

Jo, weil sich TComponents im Destruktor beim Owner abmelden. Das Free ist also doppelt gemoppelt, aber unschädlich.
Wenn du .FreeAndNil verwendet hättest vielleicht. Bei nur .Free nicht!

uligerhardt 11. Sep 2006 10:56

Re: Jedi VCL und Delphi Turbo Exp.
 
Zitat:

Zitat von mkinzler
Zitat:

Jo, weil sich TComponents im Destruktor beim Owner abmelden. Das Free ist also doppelt gemoppelt, aber unschädlich.
Wenn du .FreeAndNil verwendet hättest vielleicht. Bei nur .Free nicht!

Was meinst du - das Abmelden oder die Unschädlichkeit? Das Abmelden funktioniert. Probier's doch einfach mal aus. FreeAndNil(...) ist natürlich sicherer, oft aber auch überflüssig (z.B. wenn man eine lokale Variable am Ende der Routine killt).

mkinzler 11. Sep 2006 11:28

Re: Jedi VCL und Delphi Turbo Exp.
 
Wenn du die Instanz manuell mit .free freigibst, dann belibt in der Referenz die Speicheradresse des Objekts stehen. So erkennt anschließend der Destruktor der Form nicht, daß du das Objekt schon freigegeben hast und versucht die Freigabe erneut. In den meißten Fällen wird das keine Problem sein, da das .OnCreate kurz vor dem Destruktor aufgerufen wird. Ich würde mich aber nicht drauf verlassen.

Flocke 11. Sep 2006 11:48

Re: Jedi VCL und Delphi Turbo Exp.
 
Nachfahren von TComponent mit einem gültigen Owner (hier die Form) melden sich beim Erzeugen beim Owner an und beim Zerstören wieder ab - Probleme kann es also nur geben, wenn man selbst das .Free aufruft, nachdem die Form die Komponente zerstört hat - das ist IMHO aber zum Zeitpunkt des Ereignisses OnDestroy nicht so.

[Edit]Etwas umformuliert[/Edit]

uligerhardt 11. Sep 2006 11:53

Re: Jedi VCL und Delphi Turbo Exp.
 
Zitat:

Zitat von mkinzler
Wenn du die Instanz manuell mit .free freigibst, dann belibt in der Referenz die Speicheradresse des Objekts stehen.

In der Tat. Das ist der Teil bzgl. Sicherheit.

Zitat:

Zitat von mkinzler
So erkennt anschließend der Destruktor der Form nicht, daß du das Objekt schon freigegeben hast und versucht die Freigabe erneut.

Nö. Ein Kind-Control wird vom Parent-WinControl aufgeräumt, weil es in dessen Controls-Array steht. Eine Kind-Komponente wird vom Owner aufgeräumt, da sie in dessen Components-Array steht. Hab ich schon mal geschrieben, und der VCL-Quelltext verrät's dir auch. :-)

Zitat:

Zitat von mkinzler
In den meißten Fällen wird das keine Problem sein, da das .OnCreate kurz vor dem Destruktor aufgerufen wird. Ich würde mich aber nicht drauf verlassen.

Wenn es so wäre, würde ich mich auch nicht drauf verlassen. :-P

uligerhardt 11. Sep 2006 11:58

Re: Jedi VCL und Delphi Turbo Exp.
 
Zitat:

Zitat von uligerhardt
Nö. Ein Kind-Control wird vom Parent-WinControl aufgeräumt, weil es in dessen Controls-Array steht. Eine Kind-Komponente wird vom Owner aufgeräumt, da sie in dessen Components-Array steht.

Das ist zwar alles richtig, aber irrelevant. Grmml. Aber Flocke hat ja eh geschrieben, was ich zum Ausdruck bringen wollte. BTW: Wo war denn der rote Kasten?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr.
Seite 5 von 6   « Erste     345 6      

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