![]() |
TComponent.Destroying nicht virtual!?
Ahoi,
ich bastle gerade an einer nicht visuellen Komponente die diverse properties eines Forms und deren Komponenten beim schließen speichert. Gegenwärtig wird OnDestroy gesubclassed was ich allerdings gern verweiden würde. Es gibt ja die Methode TComponent.Destroying welche genau richtig für meine komponente wäre. Aber leider nicht als virtual deklariert ist. Bei der Freigabe des Forms wird in TComponent.DestroyComponents() vor dem Instance.Destroy die procedure TComponent.Remove() aufgerufen die FOwner auf nil setzt. Ausserdem könnten schon einige andere Komponenten der form freigegeben werden bevor meine komponente drankäme... Gibt es eine Alternative zum subclassing? Ein überschreibares Destroying wäre ja zu schön gewesen... Shalom |
AW: TComponent.Destroying nicht virtual!?
Ich vermute mal, daß du nicht OnDestroy meinst, sondern Destroy. Andernfalls zeig mal etwas Code, damit ich verstehe, was du meinst.
Also Detroy überschreiben wäre sicher der erste Ansatz. Alternativ bietet sich auch BeforeDestruction an. Damit wäre man dann sogar noch vor den Destroys der abgeleiteten Klassen dran. |
AW: TComponent.Destroying nicht virtual!?
Überschreibe die Methode TComponent.Notification.
Ungefähr so:
Delphi-Quellcode:
procedure TMyComponent.Notification(AComponent: TComponent; Operation: TOperation);
begina if (Operation=opRemove) and (AComponent=FMeinForm) then begin SavePropertiesVonForm(FMeinForm); FMeinForm := nil; end; end; |
AW: TComponent.Destroying nicht virtual!?
@Uwe Raabe:
Im Constructor der Komponente wird das OnDestroy in einer Feldvariable gespeichert und neu gesetzt:
Delphi-Quellcode:
wird des Form dann geschlossen wird "OwnerOnDestroy()" aufgerufen:
...
FOwnerOnDestroy := TForm(AOwner).OnDestroy; TForm(AOwner).OnDestroy := OwnerOnDestroy; ...
Delphi-Quellcode:
funktioniert ja so weit auch. hätte gehofft das es was "schickeres" / praktischeres gibt...
...
Self.SaveComponentsProps(); if Assigned(FOwnerOnDestroy) then FOwnerOnDestroy(Owner); @sx2008: Hatte ich auch probiert aber das Formular sendet ja keine notification zu child-komponenten wenn es gefreed wird sondern nur wenn child-komponenten des owners freigegeben werden. Die abfrage "if (Operation = opRemove) AND (AComponent = Owner) then" funktioniert also nicht. shalom |
AW: TComponent.Destroying nicht virtual!?
Zitat:
Delphi-Quellcode:
bei dem Form dafür registrieren. Mittels
FMeinForm.FreeNotification(Self)
Delphi-Quellcode:
kann diese auch wieder aufgehoben werden.
RemoveFreeNotification
Die Notifications kommen direkt nach
Delphi-Quellcode:
.
DestroyComponents
|
AW: TComponent.Destroying nicht virtual!?
hm, würde eigentlich prima gehen hat aber den haken, dass ich zur laufzeit erzeugte controls dann nicht erfassen könnte da der destructor des forms zuerst durchläuft. aber trotzdem danke für den guten tipp.
ich glaub ich belass es erstmal so wie es ist - es funktioniert ja immerhin :) shalom |
AW: TComponent.Destroying nicht virtual!?
Hi,
warum verwendest Du nicht einfach BeforeDestruction? Grüße |
AW: TComponent.Destroying nicht virtual!?
Zitat:
BeforeDestruction wird unmittelbar vor der Freigabe der komponente aufgerufen. Zu diesem zeitpunkt sind, selbst wenn ich die erstellreihenfolge in der IDE ändere schon komponenten der form freigeben. Shalom |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 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