unit demo_stream; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type Ts20 = string[20]; TdemoRec = record aChar: Char; anInt: integer; aString: Ts20; aDate: TDateTime; end; { TdemoStream } TdemoStream = class(TMemoryStream) private function GenerateRandomRec(num: integer): TdemoRec; public rec: TdemoRec; constructor Create(numRecords: integer); function RecAsString: string; end; implementation uses math; { TdemoStream } function TdemoStream.GenerateRandomRec(num: integer): TdemoRec; begin Result.aChar := Chr(65 + Random(26)); Result.aDate := TDateTime(RandomRange(100, trunc(Now)) + Random/10000); Result.anInt := num; Result.aString := Format('example string %d', [num]); end; constructor TdemoStream.Create(numRecords: integer); var i: integer; begin // Initialize random number generator Randomize; // Call the inherited constructor inherited Create; Position := 0; for i := 0 to numRecords-1 do Write(GenerateRandomRec(i), SizeOf(TdemoRec)); end; function TdemoStream.RecAsString: string; begin Read(rec, SizeOf(rec)); Result := Format( '%5d %s %17s %s', [rec.anInt, rec.aChar, rec.aString, FormatDateTime('dd-mm-yyyy:mm:ss', rec.aDate)] ); end; end.