AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Wer ruft destroy auf?

Ein Thema von iphi · begonnen am 29. Jan 2014 · letzter Beitrag vom 29. Jan 2014
Antwort Antwort
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

Wer ruft destroy auf?

  Alt 29. Jan 2014, 10:53
Hallo,

hier ein kleines Codebeispiel zu meinem Problem, welches bei Programmstart ein Objekt dynamisch erzeugt und bei Programmende wieder verschwinden lässt:

Hauptunit:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    Test: TTest;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Test:=TTest.create(self);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Test.Free;
end;

end.
Unit2:
Delphi-Quellcode:
unit Unit2;

interface

uses classes, Windows;

type
  TTest = class(TComponent)
  private
  public
    constructor
              create(AOwner : TComponent); overload;
    destructor
              destroy; overload;
  published
  end;

implementation

constructor TTest.Create(AOwner : TComponent);
begin
  writeln('creating');
  inherited create(AOwner);
end;

destructor TTest.Destroy;
begin
  inherited destroy;
  writeln('destroyed');
  sleep(1000);
end;

end.
Mein Destructor TTest.Destroy wird nie aufgerufen. Warum? Ich dachte, Test.Free bewirkt, dass der Destruktor von TTest aufgerufen wird.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Wer ruft destroy auf?

  Alt 29. Jan 2014, 10:55
Statt overload musst du override nehmen!

Das kann einem nicht passieren, wenn man das CodeCompletion benutzt.
Innerhalb der Klassendefinition Strg-Leer drücken (oder war es Shift-Strg-Leer) und du bekommst alle virtuellen Methoden/Properties der Vorgänger-Klasse angezeigt und kannst die gewünschte mit Enter übernehmen.
(Mehrfachauswahl geht übrigens auch)

Die IDE komplettiert jetzt die Klasse und sortiert alles auch in die richtigen Bereiche (protected/public/published) ein.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (29. Jan 2014 um 10:59 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.092 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Wer ruft destroy auf?

  Alt 29. Jan 2014, 10:56
Außerdem würde ich den geerbten Destruktor doch am Ende deines Destruktor mittels inherited aufrufen, nicht am Anfang?

PS: Tolles Minimalbeispiel! Man sieht direkt um was es geht und muss nicht lange herumraten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wer ruft destroy auf?

  Alt 29. Jan 2014, 10:58
Bei TForm1 stimmt aber was nicht.

OnClose ist nicht das Gegenstück von OnCreate ... das ist nämlich OnDestroy.
Wenn man die Form mehrfach anzeigt und zwischendurch nur "ausblendet", dann wird nur einmal OnCreate, aber mehrmals Onclose ausgrufen, womit es beim zweiten Durchgang hoffentlich schön knallen wird.


PS: Dein TTest ist doch ein TComponent und du setzt den Owner auf die Form ... der Owner kümmert sich um die Freigabe und wenn die TForm1 freigegeben wird, würde es dann auch automatisch das TTest mit freigeben. (wenn du es nicht vorher "unnötiger" Weise, schon freigegeben hast)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.287 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Wer ruft destroy auf?

  Alt 29. Jan 2014, 11:00
Außerdem würde ich den geerbten Destruktor doch am Ende deines Destruktor mittels inherited aufrufen, nicht am Anfang?
Solange du auf keine Eigenschaften der Elternklasse zugreifst, ist das ja egal. Wichtig ist es nur, wenn du z.B. auf ein Objekt einer Elternklasse zugreifst, das im Destruktor dann natürlich zerstört wird, wenn du ihn vor deinem Code aufrufst.

Insofern macht es Sinn den geerbten Destruktor immer nach dem eigenen Code aufzurufen um da keinen Fehler zu machen, aber ein allgemeines Muss ist es nicht. Die Zerstörung des Objekts an sich passiert erst nach dem eigenen Destruktor.

Nebenbei noch als Erklärung:
overload fügt eine weitere Methode mit dem selben Namen hinzu, die dann andere Parameter haben kann als andere in der selben Klasse, override hingegen überschreibt die ursprüngliche Methode, so dass deine statt dieser aufgerufen wird.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#6

AW: Wer ruft destroy auf?

  Alt 29. Jan 2014, 11:02
Zitat:
Statt overload musst du override nehmen!
Uff, danke! Manchmal sieht man den Wald vor lauter Bäumen nicht...

Und danke für die vielen Tipps!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#7

AW: Wer ruft destroy auf?

  Alt 29. Jan 2014, 11:06
Außerdem würde ich den geerbten Destruktor doch am Ende deines Destruktor mittels inherited aufrufen, nicht am Anfang?
Das kommt drauf an, wes man erreichen will.
Soll der Code vor den Freigaben der Elternklassen sein, oder danach.
Aber im Allgemeinen macht es sich gut, wenn das inerited im Create am Anfang und beim Destroy am Ende steht, da man im Code ja oftmals funktionen nutzen will, welche da schon/noch vom Vorfahren vorhanden sein sollten.


Man kann es auch mitten drin aufrufen.
Delphi-Quellcode:
WriteLn('destroying');
...
inherited;
...
WriteLn('destroyed');
Eventuell kann man auch AfterConstruction und BeforeDestruction verwenden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Wer ruft destroy auf?

  Alt 29. Jan 2014, 11:14
Hier mal eine kleine Foto-Story zum CodeCompletion

Innerhalb der Klassendefinition Strg-Leer drücken
step1.png
Jetzt die Anfangsbuchstaben der gewünschten Methode eintippen (für Create einfach mal cr)
step2.png
Die Auswahl mit Enter bestätigen und ...
step3.png
Und jetzt noch mal Shift-Strg-C und wir können loslegen
step4.png
Einfacher geht es nicht mehr
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (29. Jan 2014 um 11:20 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:39 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