Sign in Join
Wiki copytemporary

Record

Deutsch · English · Español · Français · Magyar · Polski · Português · Suomi · Русский

A record is a highly structured data type in Pascal. They are widely used in Pascal, to group data items together logically.

While simple data structures such as arrays or sets consist of elements all of the same type, a record can consist of a number of elements of different types, and can take on a huge complexity. Each separate part of a record is referred to as a field.

The word record is a reserved word.

Declaration

Fixed structure

pascal
type
    TMember = record
        firstname, surname : string;
        address: array [1..3] of string;
        phone: string;
        birthdate: TDateTime;
        paidCurrentSubscription: boolean
    end;

Variable structure

And even more complex structures are possible, e.g.:

pascal
type
    TMaritalState = (unmarried, married, widowed, divorced);
    TPerson = record
        // CONSTANT PART
        // of course records may be nested
        name: record
            first, middle, last: string;
        end;
        sex: (male, female);
        // date of birth
        dob: TDateTime;
        // VARIABLE PART
        case maritalState: TMaritalState of
            unmarried: ( );
            married, widowed: (marriageDate: TDateTime);
            divorced: (marriageDateDivorced, divorceDate: TDateTime;
                isFirstDivorce: boolean)            
    end;

Note that fields of the variable part have to be in parentheses. You cannot use the same identifier multiple times, so a slightly different name has to be used for the marriageDate in case of divorced.

The variable part shares the same memory. So marriageDate and marriageDateDivorced will have the same value regardless of maritalState. This behaviour is particularly practical as the following example shows:

pascal
type
  TSpecialWord = record
    case Byte of
      0: (Word_value: Word);                      // 7
      1: (Byte_low, Byte_high: Byte);             // 7, 0
      2: (Bits: bitpacked array [0..15] of 0..1); // 1, 1, 1, 0, 0, ...
  end;

This record has only a variable part and enables access to the value of the word, the individual bytes and even to the bits. An identifier is not necessarily required in the case clause, so this does not occupy any memory. The size of this record is two bytes. In the case of Bits, this is only possible if bitpacked is used. Note the order of the bytes, with the less significant byte (LSB) coming first.

Advanced record

An “advanced record” is a record with methods, properties and management operators

Note: Remember to add a compiler directive {$modeSwitch advancedRecords} (after you have set the mode).

Addressing

Fields

Individual fields are accessed by placing a dot between the record name and the field name thus:

pascal
    a.firstname := 'George';
    a.surname := 'Petersen';
    a.phone := '789534';
    a.paidCurrentSubscription := true;

Alternatively, the whole series of fields can be made available together using the with-construct:

pascal
with a do
begin
    firstname := 'George';
    surname := 'Petersen';
    phone := '789534';
    paidCurrentSubscription := true
end;

Instances

A record is treated by the program as a single entity, and for example a whole record can be copied (provided the copy is of the same type) thus:

pascal
var
    a, b: TMember;

(* main program *)
begin
    // ... assign values to the fields in record a
    b := a
    // Now b holds a _copy_ of a.
    // Do not get confused with references:
    // a and b still point to _different_ _entities_ of TMember.
end.

Constant record

pascal
type
    // record definition
    TSpecialDay = record
        dayName: string;
        month: integer;
        day: integer;
    end;

const
    // TSpecialDay constant
    christmasDay: TSpecialDay = (
        dayName: 'Christmas Day';
        month: 12;
        day: 25;
    );

// since FPC 3.2.0 you may define an constant array of records like this
const
   SpecialDays: array of TSpecialDay = (
     ( dayName: 'Christmas Day' ; month: 12; day: 25),
     ( dayName: 'New Year''s Day'; month:  1; day:  1)
   );

Records compared to other structured types

See also


From the Free Pascal wiki, page "Record", as it stood on 2022-11-28 after a change by Dbannon, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 1, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.