Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Zur Laufzeit Comboboxen hinzufügen

  Alt 18. Feb 2020, 11:34
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat