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;