Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TComponent.Destroying nicht virtual!? (https://www.delphipraxis.net/153503-tcomponent-destroying-nicht-virtual.html)

Meta777 5. Aug 2010 13:46

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

Uwe Raabe 5. Aug 2010 14:36

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.

sx2008 5. Aug 2010 15:27

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;

Meta777 5. Aug 2010 16:57

AW: TComponent.Destroying nicht virtual!?
 
@Uwe Raabe:
Im Constructor der Komponente wird das OnDestroy in einer Feldvariable gespeichert und neu gesetzt:
Delphi-Quellcode:
    ...
    FOwnerOnDestroy := TForm(AOwner).OnDestroy;
    TForm(AOwner).OnDestroy := OwnerOnDestroy;
    ...
wird des Form dann geschlossen wird "OwnerOnDestroy()" aufgerufen:
Delphi-Quellcode:
  ...
  Self.SaveComponentsProps();

  if Assigned(FOwnerOnDestroy) then
    FOwnerOnDestroy(Owner);
funktioniert ja so weit auch. hätte gehofft das es was "schickeres" / praktischeres gibt...

@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

Uwe Raabe 5. Aug 2010 17:56

AW: TComponent.Destroying nicht virtual!?
 
Zitat:

Zitat von Meta777 (Beitrag 1039846)
@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.

Um an die Notification zu kommen, muss sich die interessierte Komponente erste mit
Delphi-Quellcode:
FMeinForm.FreeNotification(Self)
bei dem Form dafür registrieren. Mittels
Delphi-Quellcode:
RemoveFreeNotification
kann diese auch wieder aufgehoben werden.

Die Notifications kommen direkt nach
Delphi-Quellcode:
DestroyComponents
.

Meta777 5. Aug 2010 19:44

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

Lemmy 6. Aug 2010 08:21

AW: TComponent.Destroying nicht virtual!?
 
Hi,

warum verwendest Du nicht einfach BeforeDestruction?

Grüße

Meta777 6. Aug 2010 16:04

AW: TComponent.Destroying nicht virtual!?
 
Zitat:

Zitat von Lemmy (Beitrag 1039931)
Hi,

warum verwendest Du nicht einfach BeforeDestruction?

Grüße

Hi,
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