{ 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.