![]() |
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:
Weshalb wird der Destructor TForm1.Destroy beim Beenden der Anwendung nicht ausgeführt?
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. 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 |
Re: Destructor Destroy
|
Re: Destructor Destroy
Ich weiß :)
Aber in meinem Beispiel verwende ich vorerst keine Form. |
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 |
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? |
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 06:32 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-2025 by Thomas Breitkreuz