Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#6

AW: Wann sind objecte auf der IDE fertig initialisert?

  Alt 28. Feb 2018, 11:58
Und man kann viel Unfug mit solchen Settern anrichten: ...
Man muß es nur richtig machen.

Delphi-Quellcode:
type
  TMyClass = class(TComponent)
  private
    FInstance: TComponent;
    procedure SetInstance(Value: TComponent);
  protected
     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  published
    property Instance: TComponent read FInstance write SetInstance;
  end;

procedure TMyClass.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;
  if Operation = opRemove then begin
    if FInstance = AComponent then
      FInstance := nil;
  end;
end;

procedure TMyClass.SetInstance(Value: TComponent);
begin
  //if Assigned(FInstance) then begin
  // FInstance.RemoveFreeNotification(Self);
  FInstance := Value;
  if Assigned(FInstance) then begin
    FInstance.FreeNotification(Self);
end;
FreeNotification hat keine Referenzzählung.
Weitere Property und auch Onwer oder Parent registrieren das ebenfalls, also einfach garnicht deregistrieren. (macht die TComponent von selber, wenn Einer von Beiden freigegeben wird)
Also kann man deregistrieren, aber nur wenn man die volle Kontrolle über alle Referenzen besitzt, oder wenn man definitiv nur die eintige Referenz sein kann. (nur interne Instanzen, auf die es von Extern keinen Zugriff gibt)

FInstance.FreeNotification(Self); und Self.FreeNotification(FInstance); ist das Gleiche ... die registrieren sich gegenseitig.



Unter ARC könnte man auch Weak-Referenzen nutzen, wo das ARC diese global registriert und auf NIL setzt, wenn jemand die Instanz freigibt.
var [weak] Instance: TComponent;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Feb 2018 um 12:08 Uhr)
  Mit Zitat antworten Zitat