siehe TComponentList (
unit Contnrs)
Eine TList, die ein Dummy-TComponent drinnen hat oder die selbst ein TComponent ist, über dessen TComponent.Notification beim opRemove es das jeweilige Objekt aus der Liste löscht.
TList.Notify bei lnAdded via TComponent.FreeNotification registrieren und beim lnExtracted/lnDeleted via TComponent.RemoveFreeNotification deregistrieren. (wer bei wem ist egal, da alles gegenseitig)
Delphi-Quellcode:
procedure TComponentListDummy.Notification(AComponent: TComponent; Operation: TOperation);
begin
if Operation = opRemove then
Parent.Extract(AComponent); // Item aus Liste entfernen, ohne enthaltenes Objekt (nochmal) freizugeben
inherited;
end;
procedure TComponentList.Notify(Ptr: Pointer; Action: TListNotification);
begin
if Assinged(Ptr) then
case Action of
lnAdded:
TComponent(Ptr).FreeNotification(FDummy);
lnExtracted, lnDeleted:
TComponent(Ptr).RemoveFreeNotification(FDummy);
end;
inherited;
end;
Nochmal als Beispiel mit einem Property:
Delphi-Quellcode:
type
TDemo = class(TComponent)
private
FLink: TComponent;
procedure SetLink(Value: TComponent);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
property Link: TComponent read FLink write SetLink;
end;
procedure TDemo.SetLink(Value: TComponent);
begin
if Assigned(FLink) then
Self.RemoveFreeNotification(FLink); // oder FLink.RemoveFreeNotification(Self);
FLink := Value;
if Assigned(FLink) then
Self.FreeNotification(FLink);
end;
procedure TDemo.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if Operation = opRemove then begin
if FLink = AComponent then
FLink := nil;
end;
end;