Hello.

I've found this code somewhere and I'm going to use it my engine:
[pascal]
type
{ .: TDArray :. }
// By Tom Nyudens
TDArray = class(TObject)
private
{ Private declarations }
FCount: Integer;
procedure SetCount(C: Integer);
protected
{ Protected declarations }
FData: Pointer;
FItemSize: Integer;
procedure GetItem(I: Integer; var Result);
procedure SetItem(I: Integer; var Value);
public
{ Public declarations }
constructor Create(); virtual;
destructor Destroy(); override;

procedure DeleteItem(I: Integer);

property ItemSize: Integer read FItemSize;
property Count: Integer read FCount write SetCount;
property Data: Pointer read FData write FData;
end;

{ ... }

{ TDArray }

constructor TDArray.Create;
begin
inherited Create();

FItemSize := 1;
Count := 0;
end;

procedure TDArray.DeleteItem(I: Integer);
var
P: Pointer;
begin
if (I >= Count) then
raise Exception.Create('Array index out of bounds.')
else begin
P := FData;
Inc(Integer(P), I * FItemSize);
ZeroMemory(@P, FItemSize);
CopyMemory(FData, @P, FItemSize);
end;
end;

destructor TDArray.Destroy;
begin
FreeMem(FData, FCount * FItemSize);

inherited Destroy();
end;

procedure TDArray.GetItem(I: Integer; var Result);
var
P: Pointer;
begin
if (I >= Count) then
raise Exception.Create('Array index out of bounds.')
else begin
P := FData;
Inc(Integer(P), I * FItemSize);
CopyMemory(@Result, P, FItemSize);
end;
end;

procedure TDArray.SetCount(C: Integer);
begin
FCount := C;
ReallocMem(FData, FCount * FItemSize);
end;

procedure TDArray.SetItem(I: Integer; var Value);
var
P: Pointer;
begin
if (I >= Count) then
SetCount(I + 1);
P := FData;
Inc(Integer(P), FItemSize * I);
CopyMemory(P, @Value, FItemSize);
end;
[/pascal]

Everything works fine except the DeleteItem procedure (which is written by me). It seems to delete the data from the pointer, but when I try to add a new item, I've got an AV. :?

How do I delete something from a pointer without touching the rest of data stored in this pointer?

Thank you in advance.