AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tcomponent/destructor

Ein Thema von Sh4d0w · begonnen am 13. Sep 2006 · letzter Beitrag vom 14. Sep 2006
Antwort Antwort
Seite 1 von 2  1 2      
Sh4d0w

Registriert seit: 19. Okt 2005
57 Beiträge
 
#1

Tcomponent/destructor

  Alt 13. Sep 2006, 20:20
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Tcomponent/destructor

  Alt 13. Sep 2006, 20:25
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Tcomponent/destructor

  Alt 13. Sep 2006, 20:29
Zitat von mkinzler:
... oder besser .FreeAndNil


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

In wie fern wird denn die Komponente nicht "gelöscht"?
  Mit Zitat antworten Zitat
beo

Registriert seit: 7. Sep 2006
13 Beiträge
 
#4

Re: Tcomponent/destructor

  Alt 13. Sep 2006, 20:32
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.
Christian
  Mit Zitat antworten Zitat
Sh4d0w

Registriert seit: 19. Okt 2005
57 Beiträge
 
#5

Re: Tcomponent/destructor

  Alt 13. Sep 2006, 20:41
Danke erstmal!

Also, ich habe mit haus.free das haus freigegeben und dann destroy aufgerufen, aber er macht nix!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Tcomponent/destructor

  Alt 13. Sep 2006, 20:44
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?
Markus Kinzler
  Mit Zitat antworten Zitat
beo

Registriert seit: 7. Sep 2006
13 Beiträge
 
#7

Re: Tcomponent/destructor

  Alt 13. Sep 2006, 20:45
haus.free ruft den Destructor von Haus automatisch auf. Ein erneuter Aufruf von Destroy wäre falsch.
Christian
  Mit Zitat antworten Zitat
Sh4d0w

Registriert seit: 19. Okt 2005
57 Beiträge
 
#8

Re: Tcomponent/destructor

  Alt 13. Sep 2006, 20:49
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."
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Tcomponent/destructor

  Alt 13. Sep 2006, 20:51
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Sh4d0w

Registriert seit: 19. Okt 2005
57 Beiträge
 
#10

Re: Tcomponent/destructor

  Alt 13. Sep 2006, 20:57
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:05 Uhr.
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