AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TComponent.Destroying nicht virtual!?

Ein Thema von Meta777 · begonnen am 5. Aug 2010 · letzter Beitrag vom 6. Aug 2010
Antwort Antwort
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

TComponent.Destroying nicht virtual!?

  Alt 5. Aug 2010, 14:46
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: TComponent.Destroying nicht virtual!?

  Alt 5. Aug 2010, 15:36
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.
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: TComponent.Destroying nicht virtual!?

  Alt 5. Aug 2010, 16:27
Ü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;
  Mit Zitat antworten Zitat
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: TComponent.Destroying nicht virtual!?

  Alt 5. Aug 2010, 17:57
@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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

AW: TComponent.Destroying nicht virtual!?

  Alt 5. Aug 2010, 18:56
@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 FMeinForm.FreeNotification(Self) bei dem Form dafür registrieren. Mittels RemoveFreeNotification kann diese auch wieder aufgehoben werden.

Die Notifications kommen direkt nach DestroyComponents .
Uwe Raabe
  Mit Zitat antworten Zitat
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: TComponent.Destroying nicht virtual!?

  Alt 5. Aug 2010, 20:44
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
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: TComponent.Destroying nicht virtual!?

  Alt 6. Aug 2010, 09:21
Hi,

warum verwendest Du nicht einfach BeforeDestruction?

Grüße
  Mit Zitat antworten Zitat
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: TComponent.Destroying nicht virtual!?

  Alt 6. Aug 2010, 17:04
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 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