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