Enumerations

type
  TInfoKind = (ikVersion, ikName);

  //variant record: the tail fields
  //depend on Kind; managed types are
  //not allowed there, hence ShortString
  TProgramInfo = record
    case Kind: TInfoKind of
      ikVersion: (
        Major, Minor, Build: Integer);
      ikName: (Name: ShortString);
  end;

procedure PrintInfo(const Info: TProgramInfo);
begin
  case Info.Kind of
    ikVersion:
      WriteLn('version: ', Info.Major'.',
        Info.Minor'.', Info.Build);
    ikName:
      WriteLn('name: ', Info.Name);
  end;
end;

var
  Info: TProgramInfo;
begin
  Info.Kind := ikName;
  Info.Name := 'CCDEditor';
  PrintInfo(Info);

  Info.Kind := ikVersion;
  Info.Major := 3;
  Info.Minor := 5;
  Info.Build := 25467;
  PrintInfo(Info);
end.