Einzelnen Beitrag anzeigen

Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Move und FillChar bei strings.

  Alt 8. Jun 2014, 18:04
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;

Geändert von Bjoerk ( 8. Jun 2014 um 18:09 Uhr) Grund: Edit: Code
  Mit Zitat antworten Zitat