Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Herausfinden, wann Komponente zerstört wird


Ex0rzist - Mi 18.12.02 11:25
Titel: Herausfinden, wann Komponente zerstört wird
Hallo,

wie gesagt, ich möchte gern herausfinden, wann eine beliebige zerstört wird. Bei TForm gibt es ja OnDestroy. Aber wie sieht es mit anderen Komponenten aus? :?
Wie kann ich für diese Komponenten ein OnDestroy erstellen?


opfer.der.genauigkeit - Mi 18.12.02 12:52

Für was für Komponenten möchtest du denn noch ein OnDestroy Ereignis erstellen? Für Buttons od. Memo z.b.?

Ich denke mal, das ist zwar weniger nötig, aber es müßte gehen, wenn du
von höheren Klassen dieses Ereignis ableitest und überschreibst.
Hab selber noch nicht so viel Erfahrung mit der Komponentenentwicklung
aber ich wette mal, daß OnDestroy od. OnClose in allen KlassenObjekten vorhand ist. Müßte ja eigentlich schon in TObject sein...
Aber wenn das jemand besser weiß, dann bitte verbessert mich :!:


smiegel - Mi 18.12.02 13:30

Hallo,

zerstört erst, wenn man Free aufruft. Für Komponenten gibt es kein OnDestroy. Dieses Ereignis gibt es nur für Formulare.

Bei Komponenten muss man den destructor Destroy überschreiben.


opfer.der.genauigkeit - Mi 18.12.02 13:34

Hab grad mal nachgeschaut.
Im TObject gibt es die Methode Free.

Zitat:

Mit Free wird ein Objekt freigegeben. Wenn die Objektreferenz nicht
nil ist, wird Destroy aufgerufen.


Such mal in der Hilfe im Index nach "TObject,Free", dann findest ne genaue Beschreibung.


Andreas.Schmid - Mi 18.12.02 13:35
Titel: Normalerweise nach dem OnDestroy vom Formular
Bei allen Visuellen Komponenten gibt es die Möglichkeit ein OnDestroy Ereignis zu generieren, dass ist allerdings sehr kompliziert und ich weiß leider auch nicht genau wie das funktioniert.

In TForm und allen Nachfahren gibt es ein "OnDestroy"-Ereignis. Du könntest also dort deine Code platzieren.

Also die Komponeten auf dem Formular werden in der Regel nach dem "OnDestroy"-Ereignis des Formulars freigegeben, sodass man mit den Componenten nach etwas machen kann.

Was willst du überhaupt darin machen, vielleicht gibt es auch eine andere Lösung für dein Problem?

_________________
Noch viel Spaß!!!
Andreas Schmid


Ex0rzist - Mi 18.12.02 14:01

Erstmal danke für die zahlreichen Antworten.

@Andreas.Schmid

Ich brauche es eigentlich nur zum Debuggen. Mein Problem ist, das ich ein Memo habe, das von dem Formular "abgedockt" ist (Floating = True).
Wenn ich nun die Anwendung schließe, soll der Text in dem Memo noch schnell gespeichert werden. Es kommt dabei aber zu einer Exception, da bei der Speichern-Prozedur im OnDestroy des Formulars das Memo bereits nil ist.
Und deshalb wollte ich wissen, wann genau dieses Memo zerstört wird. :?


smiegel - Mi 18.12.02 14:36

Hallo,

dann schau Dir einmal das Ereignis OnClose an.


Ex0rzist - Mi 18.12.02 15:15

Jetzt klappt es. :)

Das OnClose kam für mich erst nicht in Frage, da im OnCloseQuery CanClose := False war.

Ich habe einfach eine zusätzliche globale (ich weiss - *pfui* :lol:) Variable eingeführt, mit der ich dann überprüft habe, ob die Form geschlossen werden kann.

Vorher hatte ich die Form trotz CanClose := False; mit Application.Terminate; geschlossen (nochmal *pfui*).

Aber mit dem OnClose war ein guter Hinweis.
Danke nochmal.


Wolff68 - Mi 18.12.02 21:14

Tststs, und Deine globale Variable verhindert das Application.Terminate ?
Würde mich jetzt echt interresieren WIE !

Anstatt hier Pfuis zu generieren solltest mal überlegen, ob es nicht andere (sauberere) Wege gibt. Das OnClose ist ja genau für solche Zwecke integriert worden!


Ex0rzist - Do 19.12.02 00:53

Wolff68 hat folgendes geschrieben:
Tststs, und Deine globale Variable verhindert das Application.Terminate ?

Nein, tut sie nicht. Aber mit ihrer Hilfe benötige ich kein Application.Terminate mehr.

Wolff68 hat folgendes geschrieben:
Anstatt hier Pfuis zu generieren solltest mal überlegen, ob es nicht andere (sauberere) Wege gibt. Das OnClose ist ja genau für solche Zwecke integriert worden!

Das habe ich ja auch getan. Das OnClose wurde bei mir leider nur in einem bestimmten Fall ausgelöst, ansonsten war CanClose = False;.

Es tut mir leid, wenn ich in irgendeiner Weise deine Gefühle verletzt haben sollte, aber ich kann so viele Pfuis generieren, wie ich möchte. Meine Programme sind ausschließlich für den Privatgebrauch.

Natürlich gibt es immer eine bessere Variante, aber ich bin erstmal froh, das alles so klappt, wie ich möchte.