[Back to DATATYPE SWAG index]  [Back to Main SWAG index]  [Original]

{
>Is is Possible to have a File of Two different Record Types?
>How would one do this? I have seen it done..

First, don't Declare the Type of the File, just use a Type or File.

Declare Pointer Variables For each Type that the Record can be.   if you want
the Record to hold a Value that says what the Record Type is, then device an
ID scheme, and make sure the ID Variables are physically located at the same
Position in both Records.


Read that data into a buffer Record With BlockRead.  Assign the Typed
Pointers to that buffer, and process away....
}

Type
  onerec = Record  { Record size is 98 Bytes }
    id : Byte;   { We will set ID = 1 For onerec }
    Username : String[80];
    Phone : String[15];
  end;
  anotherrec = Record  { Length is 163 Bytes }
    id : Byte; {We will set ID = 2 For anotherrec }
    ADDRESS1 : String[80];
    ADDRESS2 : String[80];
  end;

Var
  ONE : ^ONEREC;
  AnotHER : ^AnotHERREC;
  Buffer : Array[1..163] of Char;   { The size of the largest Record }
  F : File;
  NumRead : Word;
  ID : Byte Absolute Buffer;   { ID points to the first Char begin}
begin
  Assign(F,'FileNAME');
  Reset(F,SizeOf(Buffer));
  One := @BUFFER;
  AnotHER := @BUFFER;
  BlockRead(F,BUFFER,SIZEof(BUFFER),NUMRead);
  While NumRead > 0 Do
  begin
    Case ID of
      1 :
        begin
          WriteLn('Record is of Type ONE');
          WriteLn('USERNAME: ',ONE^.USERNAME);
          WriteLn('Phone: ',ONE^.Phone);
        end;
      2 :
        begin
          WriteLn('Record is of Type AnotHER');
          WriteLn('Address Line 1 = ',AnotHER^.ADDRESS1);
          WriteLn('Address Line 2 = ',AnotHER^.ADDRESS2);
        end;
      else
        WriteLn('Unidentified Record Type');
    end; { of Case }
    BlockRead(F,BUFFER,SIZEof(BUFFER),NUMRead);
  end;
  Close(F);
end.


[Back to DATATYPE SWAG index]  [Back to Main SWAG index]  [Original]