[Back to OOP SWAG index] [Back to Main SWAG index] [Original]
{
From: TODD HOLMES
Heres a flexible OOP array...}
{ $TESTED}
Uses Objects;
Type
TestRec = Record
Name: String[20];
Age : Word;
end;
{A TestRecord}
PAByte = ^TAByte;
TAByte = Array[0..65519] of byte;
{General byte array}
{TArray is limited to 65520 bytes of data, and may store any type
of data.}
PArray = ^TArray;
TArray = Object(TObject)
Data : PAByte;
DataSize: Word; {Size of the Data to hold}
MaxCount: Word; {Maximum amount of items of DataSize}
Count : Word; {How many items in Array}
Constructor Init(ADataSize,ACount:Word);
Constructor Load(Var S:TStream);
Procedure Store(VAR S:TStream); Virtual;
Destructor Done;Virtual;
Procedure GetItem(Index:Word;Var Item);
Procedure PutItem(Index:Word;Var Item);
end;
Constructor TArray.Init(ADataSize,ACount:Word);
begin
Inherited Init; {TP6 Tobject.init}
DataSize := ADataSize;
MaxCount := 65520 div ADataSize; {For Error Checking}
If Acount > MaxCount then Fail; {Array is too big}
Count := ACount;
GetMem(Data,Count * DataSize); {Get Mem for the array}
FillChar(Data^,Count * DataSize,0);{Clear the Array}
end;
Constructor TArray.Load(Var S:TStream);
begin
With S do begin
Read(DataSize,SizeOf(DataSize));
Read(MaxCount,SizeOf(MaxCount));
Read(Count,SizeOf(MaxCount));
GetMem(Data,Count * DataSize);
Read(Data^,Count * DataSize);
end;
end;
Procedure TArray.Store(Var S:TStream);
begin
With S do Begin
Write(DataSize,SizeOf(DataSize));
Write(MaxCount,SizeOf(MaxCount));
Write(Count,sizeOf(Count));
Write(Data^,Count * DataSize);
end;
end;
Destructor TArray.done;
begin
FreeMem(Data,Count*DataSize);
Inherited Done;
end;
Procedure TArray.GetItem(Index:Word;Var Item);
begin
If Index > count then Exit;
Move(Data^[(Index - 1) * DataSize],Item,DataSize);
end;
Procedure TArray.PutItem(Index:Word;Var Item);
begin
If Index > count then exit;
Move(Item,Data^[(Index - 1) * DataSize],DataSize);
end;
Var
Flexable:PArray;
TR:TestRec;
I:Integer;
begin
Randomize;
Flexable := New(PArray,Init(SizeOf(TR),10));
If Flexable <> Nil then begin; {Array to big}
For I := 1 to Flexable^.Count do begin
With TR do begin
Name := 'Bobby Sue';
Age := I;
end;
Flexable^.PutItem(I,TR);
end;
For I := 1 to FlexAble^.Count do begin
FlexAble^.GetItem(I,TR);
With Tr do
Writeln('Rec ',I:2,' is Name: ',Name:20,' Age: ',Age:8);
end;
end;
Dispose(Flexable,Done);
end.
[Back to OOP SWAG index] [Back to Main SWAG index] [Original]