Ceci est une ancienne révision du document !


Record

De base

Type
 TPoint  =  record
       x : Longint; 
       y : Longint;
 end;

Packed

Source : https://www.freepascal.org/docs-html/ref/refsu15.html

Free Pascal soutient également un packed record, c'est-à-dire un enregistrement où tous les éléments sont alignés sur un octet.

Par conséquent, les deux déclarations suivantes sont équivalentes :

     {$PackRecords 1}  
     Trec2 = Record  
       A : Octet ;  
       B : Mot ;  
    end ;  
     {$PackRecords default}
 

et

     Trec2 = Packed Record  
       A : Octet ;  
       B : Mot ;  
     end;

Notez les {$PackRecords Default} après la première déclaration pour rétablir le paramètre par défaut !

Étant donné que la façon dont les enregistrements sont disposés en mémoire dépend de la plate-forme, la seule façon de garantir une disposition compatible entre les plates-formes (en supposant que tous les champs sont déclarés en utilisant un type ayant la même signification sur ces mêmes plates-formes) est d'utiliser {$PACKRECORDS 1}.

En particulier, si un fichier typé avec des enregistrements, produit par un programme Turbo Pascal, doit être lu, il y a de fortes chances que la tentative de lecture correcte de ce fichier échoue.
La raison en est que le paramètre par défaut de Free Pascal {$PACKRECORDS N} n'est pas nécessairement compatible avec celui de Turbo Pascal.
Il peut être modifié en {$PACKRECORDS 1} ou {$PACKRECORDS 2} selon le paramètre utilisé dans le programme Turbo Pascal qui crée le fichier (bien qu'il puisse toujours échouer avec {$PACKRECORDS 2} en raison des différentes exigences d'alignement de type entre MSDOS 16 bits et votre plate-forme actuelle).

Complexe

{ TRect in typshrdh.inc}
 
  TRect =
{$ifndef FPC_REQUIRES_PROPER_ALIGNMENT}
  packed
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
  record
     private
       function  getHeight: Longint; inline;
       function  getLocation: TPoint;
       function  getSize: TSize;
       function  getWidth : Longint; inline;
       procedure setHeight(AValue: Longint);
       procedure setSize(AValue: TSize);
       procedure setWidth (AValue: Longint);
     public
       constructor Create(Origin: TPoint); // empty rect at given origin
       constructor Create(Origin: TPoint; AWidth, AHeight: Longint);
       constructor Create(ALeft, ATop, ARight, ABottom: Longint);
       constructor Create(P1, P2: TPoint; Normalize: Boolean = False);
       constructor Create(R: TRect; Normalize: Boolean = False);
       class operator = (L, R: TRect): Boolean;
       class operator <> (L, R: TRect): Boolean;
       class operator + (L, R: TRect): TRect; // union
       class operator * (L, R: TRect): TRect; // intersection
       class function Empty: TRect; static;
       procedure NormalizeRect;
       function IsEmpty: Boolean;
       function Contains(Pt: TPoint): Boolean;
       function Contains(R: TRect): Boolean;
       function IntersectsWith(R: TRect): Boolean;
       class function Intersect(R1: TRect; R2: TRect): TRect; static;
       procedure Intersect(R: TRect);
       class function Union(R1, R2: TRect): TRect; static;
       procedure Union(R: TRect);
       class function Union(const Points: array of TPoint): TRect; static;
       procedure Offset(DX, DY: Longint);
       procedure Offset(DP: TPoint);
       procedure SetLocation(X, Y: Longint);
       procedure SetLocation(P: TPoint);
       procedure Inflate(DX, DY: Longint);
       procedure Inflate(DL, DT, DR, DB: Longint);
       function CenterPoint: TPoint;
       function SplitRect(SplitType: TSplitRectType; ASize: Longint): TRect;
       function SplitRect(SplitType: TSplitRectType; Percent: Double): TRect;
     public
       property Height: Longint read getHeight write setHeight;
       property Width : Longint read getWidth  write setWidth;
       property Size  : TSize   read getSize   write setSize;
       property Location  : TPoint read getLocation write setLocation;
       case Longint of
         0: (Left,Top,Right,Bottom : Longint);
         1: (TopLeft,BottomRight : TPoint);
         2: (Vector:TArray4IntegerType);
       end;         
Vous pourriez laisser un commentaire si vous étiez connecté.