where : ibrtses delphi
Delphi - runtime defineable array
disclaimer
the source code of this page may not appear correctly in certain browsers
due to special characters. Have a look at the source of this HTML page
with notepad instead
Sometimes an array whose size can be defined at runtime
is considered useful. It works as template for any dimension
while here only 1D and 2D are shown.
unit VArrays;
interface
type
IntArray=class
protected
fdata:pointer;
fsize:integer;
function getitem(index:integer):integer;
procedure setitem(index,j:integer);
public
property Q[index:integer]:Integer read getitem write setitem; default;
constructor create(size:integer);
destructor destroy; override;
procedure clear;
published
property count:integer read fsize;
end;
Int2DArray=class
protected
fdata:pointer;
fsizex,fsizey:integer;
function getitem(index1,Index2:integer):integer;
procedure setitem(index1,Index2:integer;j:integer);
public
property Q[index1,Index2:integer]:integer read getitem write setitem; default;
constructor create(x,y:integer);
destructor destroy; override;
procedure clear;
published
property countx:integer read fsizex;
property county:integer read fsizey;
end;
implementation
type
IntPtr=^integer;
function IntArray.getitem(index:integer):integer;
var p:IntPtr;
k:integer absolute p;
begin
p:=fdata;
k:=k+index*sizeof(integer);
result:=p^;
end;
procedure IntArray.setitem(index,j:integer);
var p:IntPtr;
k:integer absolute p;
begin
p:=fdata;
k:=k+index*sizeof(integer);
p^:=j;
end;
constructor IntArray.create(size:integer);
begin
inherited create;
GetMem(fdata,size*sizeof(integer));
fsize:=size;
end;
destructor IntArray.destroy;
begin
FreeMem(fdata,fsize*sizeof(integer));
inherited destroy;
end;
procedure IntArray.clear;
begin
FillChar(fdata^,fsize*sizeof(integer),0);
end;
function Int2DArray.getitem(index1,Index2:integer):integer;
var p:IntPtr;
k:integer absolute p;
begin
p:=fdata;
k:=k+(index1+Index2*fsizex)*sizeof(integer);
result:=p^;
end;
procedure Int2DArray.setitem(index1,Index2:integer;j:integer);
var p:IntPtr;
k:integer absolute p;
begin
p:=fdata;
k:=k+(index1+Index2*fsizex)*sizeof(integer);
p^:=j;
end;
constructor Int2DArray.create(x,y:integer);
begin
inherited create;
fsizex:=x; fsizey:=y;
GetMem(fdata,fsizex*fsizey*sizeof(integer));
end;
destructor Int2DArray.destroy;
begin
FreeMem(fdata,fsizex*fsizey*sizeof(integer));
inherited destroy;
end;
procedure Int2DArray.clear;
begin
FillChar(fdata^,fsizex*fsizey*sizeof(integer),0);
end;
end.
notes
use :
var myi:IntArray;
myi:=IntArray.create(10); // [0..9]
myi[1]:=0;
The datatype here is fixed to integer but can easily be
changed to any other.
This is a core structure and may be extended to :
- any fixed datatype
- any dimension
Note that in D2 and in D3, the array property could be published.
In D5 array properties have to be public.
Feedback is welcome
sponsored links
Delphi
home
last updated: 18.dec.01
Copyright (99,2001) Ing.Büro R.Tschaggelar