Einzelnen Beitrag anzeigen

mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#9

AW: Wie kann ich feststellen, ob Sub-Klasse schon gelöscht ist

  Alt 15. Sep 2023, 18:04
Wie aber kann ich TValues löschen (Free) und dann auch merken, dass der bereits gelöscht wurde.
Eine weitere Möglichkeit ist, das Values-Objekt mit einer Referenzzählung auszustatten:
Delphi-Quellcode:
type
  TValues = class(TObject)
  strict private
    FRefCount: Integer;
  private
    FX: Double;
    FY: Double;
  public
    constructor Create(pmX, pmY: Double); reintroduce;
    procedure IncReference;
    procedure DecReference;
    property X: Double
      read FX;
    property Y: Double
      read FY;
  end;

  TTest = class(TObject)
  private
    FName: String;
    FValues: TValues;
    procedure FreeValues;
    procedure SetValues(pmValues: TValues);
  public
    constructor Create(const pmcName: String); reintroduce;
    destructor Destroy; override;
    property Name: String
      read FName;
    property Values: TValues
      read FValues write SetValues;
  end;

  TTestList = class(TObjectList<TTest>)
  public
    procedure FreeAllValues;
  end;
  
constructor TValues.Create(pmX, pmY: Double);
begin
  inherited Create;
  FX := pmX;
  FY := pmY;
end;

procedure TValues.IncReference;
begin
  Inc(FRefCount);
end;

procedure TValues.DecReference;
begin
  Dec(FRefCount);
  if FRefCount = 0 then
    Self.Free;
end;

constructor TTest.Create(const pmcName: String);
begin
  inherited Create;
  FName := pmcName;
end;

destructor TTest.Destroy;
begin
  FreeValues;
  inherited Destroy;
end;

procedure TTest.FreeValues;
begin
  if FValues <> Nil then
  begin
    var v: TValues := FValues;
    FValues := Nil;
    v.DecReference;
  end;
end;

procedure TTest.SetValues(pmValues: TValues);
begin
  FreeValues;
  if pmValues <> Nil then
  begin
    pmValues.IncReference;
    FValues := pmValues;
  end;
end;

procedure TTestList.FreeAllValues;
begin
  for var i: Integer := 0 to Count - 1 do
    Items[i].Values := Nil;
end;

var
  v: TValues;
  t: TTest;
begin
  v := TValues.Create(1, 2);
  t := TTest.Create('A');
  t.Values := v;
  FList.Add(t);
  t := TTest.Create('B');
  t.Values := v;
  FList.Add(t);
  FList.FreeAllValues;
Bis bald...
Thomas

Geändert von mytbo (15. Sep 2023 um 18:07 Uhr) Grund: Tippfehler korrigiert
  Mit Zitat antworten Zitat