Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Destructor Destroy (https://www.delphipraxis.net/57055-destructor-destroy.html)

Puhbaehr 15. Nov 2005 07:24


Destructor Destroy
 
Ich trau mich fast nicht diese Frage zu stellen.

Das was ich will sollte so wie ich es mache funktionieren (laut Online-Hilfe und Delphi-Such-Resultate).

Wie wende ich Destructor Destroy richtig an?

Um jeden Fehler zu vermeiden hab ich nur das treffende in eine neue Anwendung geschrieben:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Constructor Create (Owner : TComponent); override;
    Destructor Destroy; override;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

Constructor TForm1.Create (Owner : TComponent);  // Funktioniert prima
 begin
  inherited Create (Owner);

  beep;
  showmessage ('Anwendung wird gestartet');
 end;
   
Destructor TForm1.Destroy;  // macht leider gar nichts
 begin
  beep;                                  // Um Sichtbar zu machen, dass der
  showmessage ('Anwendung wird beendet'); // Destructor Destroy wirklich ausgeführt wird

  inherited destroy;
 end;

end.
Weshalb wird der Destructor TForm1.Destroy beim Beenden der Anwendung nicht ausgeführt?
Oder kann es sein, dass ich das ShowMessage-Fenster nicht sehe weil die Anwendung bereits dabei ist sich "aufzulösen"? Ich dachte bisher, dass erst mit dem Aufruf von inherited destroy die Anwendung tatsächlich beendet wird?

Bin für jede Hilfe dankbar!

Gruß, Robert

Sharky 15. Nov 2005 07:45

Re: Destructor Destroy
 
Hai Puhbaehr,

mal unabhängig von deinem Create/Destroy : Für solche Aktionen gibt es extra die Ereingisse Delphi-Referenz durchsuchenOnCreate und Delphi-Referenz durchsuchenOnClose der Form.

Puhbaehr 15. Nov 2005 07:49

Re: Destructor Destroy
 
Ich weiß :)
Aber in meinem Beispiel verwende ich vorerst keine Form.

Der_Unwissende 15. Nov 2005 07:54

Re: Destructor Destroy
 
Hi,
wie Sharky ja schon sagte, bei einem Form solltest du nicht den Constructor oder Destructor überschreiben. Anders sieht es bei eigenen Klassen aus. Da würdest du dann einfach für die Klassenvariablen im Konstruktor Speicher allozieren und im Destruktor wieder freigeben.
Aber mal ganz kurz zu deinem Code, ich glaube bei Forms sollte man es möglichst meiden Methoden ohne Sichtbarkeitsbereich zu deklarieren. Der Bereich in den du deinen Kon- und Destruktor geschrieben hast, wird von Delphi verwaltet. Da kommen halt automatisch erzeugte Variablen und Methoden rein. Sauberer ist es da, auf private, protected und public zurückzugreifen, bei Forms halt nicht für Konstruktor und Destruktor

Gruß Der Unwissende

Puhbaehr 15. Nov 2005 08:21

Re: Destructor Destroy
 
Wird denn FormCreate vor oder nach dem Erstellen des Forms ausgeführt?

Ich verwende den Con- und Destructor in einer eigenen Klasse die in einer Unit abgepackt ist und später von einem beliebigem Form das sich in einer anderen Unit befindet aufgerufen werden soll.
Vor dem Beenden der Anwendung hatte ich vor die Prozesse wieder freizugeben. Da ich das aber nicht im Form erledigen möchte sollte das die Unit nach Möglichkeit selbst tun.
Etwa nach dem Prinzip: Wenn du erstellt worden bist mache das. Wenn geschlossen wirst mache vorher das.

Ich dachte bisher immer, dass eine als public deklarierte Methode nicht mehr durch eine private überschrieben werden kann da eine private-Methode der public-Methode untergeordnet ist?

Wenn der Con- und Destructor nicht als public deklariert werden soll/darf/kann als was dann deklarieren?

Puhbaehr 15. Nov 2005 08:49

Re: Destructor Destroy
 
Gut, Fehler gefunden.

Meine Unit hatte ich im Projekt-Teil nach dem Schema TKlasse.Create (Referrenz) gestartet, etwa so: TTCPIP.Create (TCPConnection)
TCPConnection war dabei eine Variable des Typs TTCPIP.
Dadurch wurde meine Unit nicht an die Hauptanwendung gebunden und reagierte somit nicht auf Schließereignisse und blieb sogar nach dem Schließen der Hauptanwendung offen.
Ein TKlasse.Create (Application) hat geholfen.

Vielen Dank an alle für die Hilfe!


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