====== Record ======
===== De base =====
Type
TPoint = record
x : Longint;
y : Longint;
end;
===== Packed =====
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 =====
Ne pas oublier''{$modeswitch ADVANCEDRECORDS}'' dans les directives de compilation !!!
{$modeswitch ADVANCEDRECORDS}
...
{ 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;
===== Sources et Ressources =====
* [[https://www.tutorialspoint.com/pascal/pascal_records.htm]]
* [[https://www.freepascal.org/docs-html/ref/refsu15.html]]