Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Tcomponent/destructor (https://www.delphipraxis.net/77023-tcomponent-destructor.html)

Sh4d0w 13. Sep 2006 19:20


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:
destructor THaus.destroy;
begin
  inherited destroy;
end;
In der hauptunit habe ich dann einen button, mit dem ich das haus wieder löschen möchte, da steht drin:

Delphi-Quellcode:
begin
haus.destroy;
end;
Aber das wird nicht gelöscht! Was muss ich denn noch beachten? Danke schonmal.

mkinzler 13. Sep 2006 19:25

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.

Muetze1 13. Sep 2006 19:29

Re: Tcomponent/destructor
 
Zitat:

Zitat von mkinzler
... oder besser .FreeAndNil

:gruebel: :gruebel:

FreeAndNil() ist eine Procedure und der wird dann "Haus" übergeben.

In wie fern wird denn die Komponente nicht "gelöscht"?

beo 13. Sep 2006 19:32

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.

Sh4d0w 13. Sep 2006 19:41

Re: Tcomponent/destructor
 
Danke erstmal!

Also, ich habe mit haus.free das haus freigegeben und dann destroy aufgerufen, aber er macht nix! :?:

mkinzler 13. Sep 2006 19:44

Re: Tcomponent/destructor
 
Zitat:

Zitat von Sh4d0w
Danke erstmal!

Also, ich habe mit haus.free das haus freigegeben und dann destroy aufgerufen, aber er macht nix! :?:

.Free ruft schon .Destroy auf.
Wie meinst du das es amcht nix?

beo 13. Sep 2006 19:45

Re: Tcomponent/destructor
 
haus.free ruft den Destructor von Haus automatisch auf. Ein erneuter Aufruf von Destroy wäre falsch.

Sh4d0w 13. Sep 2006 19:49

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."

mkinzler 13. Sep 2006 19:51

Re: Tcomponent/destructor
 
Zitat:

Zitat von Sh4d0w
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."

Da siehst du das es doch funktioniert hat, das Objekt existiert nach dem ersten Aufruf nicht mehr.

Sh4d0w 13. Sep 2006 19:57

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:15 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