![]() |
Tcomponent/destructor
Moin,
habe eine Frage: Und zwar habe ich zwei units. Eine hauptunit und eine andere wo eine Klasse definiert ist. Die heißt z.B type THaus = Class(Tcomponent) in dieser unit habe ich einen constructor und destructor. Im destructor steht drin:
Delphi-Quellcode:
In der hauptunit habe ich dann einen button, mit dem ich das haus wieder löschen möchte, da steht drin:
destructor THaus.destroy;
begin inherited destroy; end;
Delphi-Quellcode:
Aber das wird nicht gelöscht! Was muss ich denn noch beachten? Danke schonmal.
begin
haus.destroy; end; |
Re: Tcomponent/destructor
Dein Destructor ist eigentlich unnötig, da er nicht mehr macht als der ererbte.
man sollte auch nie .Destroy selber aufrufen sondern .Free oder besser .FreeAndNil Wenn die Komponente einen Owner besitzt, dann sorgt der für das Freigeben. |
Re: Tcomponent/destructor
Zitat:
FreeAndNil() ist eine Procedure und der wird dann "Haus" übergeben. In wie fern wird denn die Komponente nicht "gelöscht"? |
Re: Tcomponent/destructor
Im allgemeinen wernden Objekte mit .Free freigegeben.
Eine Außnahme gibt es allerdings noch bei Forms. Hier sollte man Form.Release verwenden, damit mögliche Events noch vollständig abgearbeitet werden können, bevor das Form dann freigegeben wird. Die Definition einer Klasse würde ich immer in eine Unit packen, wenn das nicht passt, sollte man sich überlegen ob man die Objekte nicht besser modellieren kann: Beispiel:
Delphi-Quellcode:
----
Unit uHaus;
interface; uses .. type THaus = class(Tcomponent) public Constructor Create(AOwner..); Destructor Destroy; override; end; implementation Constructor THaus.Create(AOwner..); begin inherited Create(AOwner); ... end; Destructor Destroy; begin ... inherited Destroy; end;
Delphi-Quellcode:
unit uTest
interface; uses uHaus; procedure Test; var haus:THaus; begin haus := THaus.Create(nil); // eine Instanz von Haus erzeugen haus.ToWas; // Instanz benutzen haus.Free; // Instanz wieder freigeben end; Du musst zwischen der Definition einer Klasse (hier in uHaus) und der Instanz (hier i uTest) einer Klasse unterscheiden. Nur die Instanz existiert wirklich, und nur mit der kannst du arbeiten. Die Definition ist eine Art Schablonbe, die beschreibt, was du abbilden möchtest. |
Re: Tcomponent/destructor
Danke erstmal!
Also, ich habe mit haus.free das haus freigegeben und dann destroy aufgerufen, aber er macht nix! :?: |
Re: Tcomponent/destructor
Zitat:
Wie meinst du das es amcht nix? |
Re: Tcomponent/destructor
haus.free ruft den Destructor von Haus automatisch auf. Ein erneuter Aufruf von Destroy wäre falsch.
|
Re: Tcomponent/destructor
Also, wenn ich in dem button nur haus.free aufrufe macht er erst nix, bei einem zweiten klick kommt diese fehlermeldung:
"Im Projekt ist eine Exception der Klasse EInvalidPointer aufgetreten. Meldung: Ungültige Zeigeroperation." |
Re: Tcomponent/destructor
Zitat:
|
Re: Tcomponent/destructor
hä? man kann es doch aber noch sehen... wie mach ich das denn weg?? und kann man die fehlermeldung unterbinden? also wenn ich ein zweites mal drauf klicke, das da die meldung dann nicht mehr kommt?
|
Re: Tcomponent/destructor
hast du ein Neuzeichnen der Form angestoßen? (.Update)
|
Re: Tcomponent/destructor
Achsooo, nun geht das! vielen dank. :-)
Aber hast du vllt. noch einen tip wie man den fehler unterbinden kann? |
Re: Tcomponent/destructor
Die Fehlermeldung kannst du unterbinden, indem du nicht den Destructor des bereits zerstörten Objekts nochmal aufrufst. FreeAndNil würde das z.B. schon verhindern. Oder du setzt haus nach dem destroy selbst auf nil und prüfst vorher mit assigned( haus ), ob es haus noch gibt.
|
Re: Tcomponent/destructor
wie kann man haus denn auf nil setzen?
so z.b:
Delphi-Quellcode:
?
if Haus <> nil then
... |
Re: Tcomponent/destructor
Bei Verwendung von
Delphi-Quellcode:
oder
FreeAndNil( haus);
Delphi-Quellcode:
haus.Free;
haus := Nil; |
Re: Tcomponent/destructor
Hallo,
falls es nicht so rausgekommen ist. Ein .Free erzeugt keinen Fehler, wenn das Object NIL ist
Delphi-Quellcode:
erzeugt also keinen Fehler.
FreeAndNIL(Haus);
FreeAndNIL(Haus); Das 2malige FreeAndNIL kannst du dir auch als 2mal Button-Klick vorstellen. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:37 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 by Thomas Breitkreuz