Brainer
13-01-2008, 06:27 AM
Hello. :)
I've found this code somewhere and I'm going to use it my engine:
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;
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.
I've found this code somewhere and I'm going to use it my engine:
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;
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.