Ok. aber was ist dann mit dem Referenzzähler?
Ich bin mit wegen den strings nicht sicher und bezweifele langsam ob das so geht und ob’s überhaupt an dem Finalize liegt? Mir scheint man kann auch bei strings nicht so moven? Bei Shortstring funktionierst hingegen einwandfrei?
Ich poste mal die Klasse:
Delphi-Quellcode:
destructor TMyStringList.Destroy;
begin
Clear;
inherited Destroy;
end;
procedure TMyStringList.Clear;
begin
FCount := 0;
Capacity := 0;
end;
function TMyStringList.DeltaCapacity: integer;
begin
if FCapacity > 64
then
Result := FCapacity
div 4
else
if FCapacity > 8
then
Result := 16
else
Result := 4;
end;
function TMyStringList.Add(
const Value:
string): integer;
begin
Result := FCount;
Insert(Result, Value);
end;
procedure TMyStringList.Insert(
const Index: integer;
const Value:
string);
begin
if FCount = FCapacity
then
Capacity := FCapacity + DeltaCapacity;
// property Capacity: integer write SetCapacity;
if Index < FCount
then
begin
Move(FItems[
Index], FItems[
Index + 1], (FCount -
Index) * SizeOf(
string));
Finalize(FItems[
Index]);
end;
FItems[
Index] := Value;
Inc(FCount);
end;
procedure TMyStringList.Delete(
const Index: integer);
begin
Dec(FCount);
if Index < FCount
then
begin
Move(FItems[
Index + 1], FItems[
Index], (FCount -
Index) * SizeOf(
string));
Finalize(FItems[FCount]);
end;
FItems[FCount] := '
';
end;
function TMyStringList.GetItems(
Index: integer):
string;
begin
Result := FItems[
Index];
end;
procedure TMyStringList.SetItems(
Index: integer;
const Value:
string);
begin
FItems[
Index] := Value;
end;
procedure TMyStringList.SetCapacity(
const Value: integer);
begin
FCapacity := Value;
SetLength(FItems, FCapacity);
end;