anchor.diff:    SetLength(FList, FCapacity);
   end;
   
  +procedure TArrayList.UnShift(Index, N: Integer);
  +var
  +  I: Integer;
  +begin
  +  Dec(FCount, N);
  +  for I := Index to Index + N - 1 do VarClear(FList[I]);
  +  if Index < FCount then begin
  +    System.Move(FList[Index + N], FList[Index],
  +      (FCount - Index) * SizeOf(Variant));
  +    FillChar(FList[FCount], N * SizeOf(Variant), 0);
  +  end;
  +end;
  +
   function TArrayList.Delete(Index: Integer): Variant;
   begin
     if (Index >= 0) and (Index < FCount) then begin
       Result := FList[Index];
  -    Dec(FCount);
  -
  -    VarClear(FList[Index]);
  -
  -    if Index < FCount then begin
  -      System.Move(FList[Index + 1], FList[Index],
  -        (FCount - Index) * SizeOf(Variant));
  -      FillChar(FList[FCount], SizeOf(Variant), 0);
  -    end;
  +    UnShift(Index, 1);
  +  end;
  +end;
  +
  +procedure TArrayList.DeleteRange(Index, Count: Integer);
  +begin
  +  if (Index >= 0) and (Index < FCount) then begin
  +    if Count > FCount - Index then Count := Fcount - Index;
  +    UnShift(Index, Count);
     end;
   end;
   
  
positive.code:     procedure Clear; virtual; abstract;
      function Contains(const Value: Variant): Boolean; virtual; abstract;
      function Delete(Index: Integer): Variant; virtual; abstract;
      procedure Exchange(Index1, Index2: Integer); virtual; abstract;
      function GetEnumerator: IListEnumerator; virtual;
      function IndexOf(const Value: Variant): Integer; virtual; abstract;
  
negative.code:     procedure Clear;
      function Contains(const Value: Variant): Boolean;
      function Delete(Index: Integer): Variant;
      procedure DeleteRange(Index, Count: Integer);
      procedure Exchange(Index1, Index2: Integer);
      function GetEnumerator: IListEnumerator;
      function IndexOf(const Value: Variant): Integer;
  