Difference between revisions of "Record/fr"

From Free Pascal wiki
Jump to navigationJump to search
 
(3 intermediate revisions by 2 users not shown)
Line 4: Line 4:
 
Les enregistrements sont très largement utilisés en Pascal pour regrouper logiquement des éléments de données.
 
Les enregistrements sont très largement utilisés en Pascal pour regrouper logiquement des éléments de données.
  
Alors que de simples structures de données tels les [[Array/fr|tableaux]] ou les [[Set/fr|ensembles]] sont constitués d'éléments tous du même type, un enregistrement peut être constitué d'un nombre d’éléments de types différents, et peut prendre une forme très complexe.
+
Alors que de simples structures de données tels les [[Array/fr|tableaux]] ou les [[Set/fr|ensembles]] sont constitués d'éléments tous du même type, un enregistrement peut être constitué d’éléments de types différents et prendre une forme très complexe.
 
Chaque partie séparée d'un enregistrement est appelé un champ.
 
Chaque partie séparée d'un enregistrement est appelé un champ.
  
 
== Déclaration ==
 
== Déclaration ==
 +
 
=== Structure fixe ===
 
=== Structure fixe ===
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
type
 
type
 
   TMember = record
 
   TMember = record
Line 21: Line 23:
  
 
=== Structure variable  ===
 
=== Structure variable  ===
 +
 
Des structures plus complexes sont possibles, par exemple :
 
Des structures plus complexes sont possibles, par exemple :
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
type
 
type
maritalStates = (single, married, widowed, divorced);
+
  maritalStates = (unmarried, married, widowed, divorced);
TPerson = record
+
  TPerson = record
(* PARTIE CONSTANTE *)
+
    (* PARTIE CONSTANTE *)
(* of course records may be nested *)
+
    (* les enregistrements peuvent être imbriqués *)
name: record
+
    name: record
first, middle, last: string;
+
first, middle, last: string;
end;
+
    end;
sex: (male, female);
+
    sex: (male, female);
(* date of birth *)
+
    (* date de naissance *)
dob: TDateTime;
+
    dob: TDateTime;
(* PARTIE VARIABLE *)
+
    (* PARTIE VARIABLE *)
case maritalStatus: maritalStates of
+
    case maritalStatus: maritalStates of
single: ( );
+
      unmarried: ( );
married, widowed: (marriageDate: TDateTime);
+
      married, widowed: (marriageDate: TDateTime);
divorced: (marriageDate, divorceDate: TDateTime;
+
      divorced: (marriageDate, divorceDate: TDateTime;
 
isFirstDivorce: boolean)
 
isFirstDivorce: boolean)
end;
+
  end;
 
</syntaxhighlight>
 
</syntaxhighlight>
Ce dernier type d'enregistrement est appelé enregistrement avec variantes. La variable, facultative, qui suit le case est appelé discriminant. Le type seul peut être mentionné, s'il n'est pas besoin de manipuler le discriminant dans le code.
+
Ce dernier type d'enregistrement est appelé enregistrement avec variantes. La variable (facultative) qui suit le case est appelé discriminant. Le type seul peut être mentionné s'il n'est pas besoin de manipuler le discriminant dans le code.
 
Dans un enregistrement, on ne peut avoir qu'une seule partie variable qui doit se trouver à la fin de cet enregistrement ; rien n'empêche cependant d'imbriquer des enregistrements avec variantes...
 
Dans un enregistrement, on ne peut avoir qu'une seule partie variable qui doit se trouver à la fin de cet enregistrement ; rien n'empêche cependant d'imbriquer des enregistrements avec variantes...
 
La taille du type est égale à la somme de celle de la partie fixe et de celle de la partie variante la plus grande. Attention : comme les différentes alternatives se superposent en mémoire, l'affectation des champs d'une variante modifie le contenu des champs des autres variantes sans vérifier la cohérence de ces changements.
 
La taille du type est égale à la somme de celle de la partie fixe et de celle de la partie variante la plus grande. Attention : comme les différentes alternatives se superposent en mémoire, l'affectation des champs d'une variante modifie le contenu des champs des autres variantes sans vérifier la cohérence de ces changements.
Line 53: Line 57:
 
=== Champs ===
 
=== Champs ===
 
On accède aux champs en plaçant un point entre le nom de l'enregistrement et le nom du champ, ainsi :
 
On accède aux champs en plaçant un point entre le nom de l'enregistrement et le nom du champ, ainsi :
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
   a.firstname := 'George';
 
   a.firstname := 'George';
 
   a.surname := 'Petersen';
 
   a.surname := 'Petersen';
Line 61: Line 66:
  
 
Éventuellement, l'accès aux groupes de champs peut être effectué sans répéter le nom de l'enregistrement à l'aide de la construction [[With/fr|with]] :
 
Éventuellement, l'accès aux groupes de champs peut être effectué sans répéter le nom de l'enregistrement à l'aide de la construction [[With/fr|with]] :
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
with a do
 
with a do
 
begin
 
begin
Line 73: Line 79:
 
=== Instances ===
 
=== Instances ===
 
Un enregistrement est traité par le programme comme une entité entière. Par exemple, un enregistrement entier peut être copié dans un autre de même type à l'aide d'une seule affectation :
 
Un enregistrement est traité par le programme comme une entité entière. Par exemple, un enregistrement entier peut être copié dans un autre de même type à l'aide d'une seule affectation :
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
var
 
var
 
   a, b: TMember;
 
   a, b: TMember;
Line 89: Line 96:
 
== Enregistrement constant ==
 
== Enregistrement constant ==
  
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
type
 
type
 
   //record declaration
 
   //record declaration
Line 109: Line 116:
  
 
== Voir aussi ==
 
== Voir aussi ==
* [[Records/fr|Enregistrements]], tutoriel qui couvre les enregistrements.
+
* [[Basic Pascal Tutorial/Chapter 5/Records/fr|Enregistrements]], tutoriel qui couvre les enregistrements.
 
* [[Object/fr|Object]]
 
* [[Object/fr|Object]]
 
* [[Class/fr|Class]]
 
* [[Class/fr|Class]]
  
 
{{Data types/fr}}
 
{{Data types/fr}}

Latest revision as of 05:37, 25 January 2023

Deutsch (de) English (en) español (es) suomi (fi) français (fr) magyar (hu) polski (pl) português (pt) русский (ru)

Un enregistrement est un type de donnée hautement structuré en Pascal. Les enregistrements sont très largement utilisés en Pascal pour regrouper logiquement des éléments de données.

Alors que de simples structures de données tels les tableaux ou les ensembles sont constitués d'éléments tous du même type, un enregistrement peut être constitué d’éléments de types différents et prendre une forme très complexe. Chaque partie séparée d'un enregistrement est appelé un champ.

Déclaration

Structure fixe

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

Structure variable

Des structures plus complexes sont possibles, par exemple :

type
  maritalStates = (unmarried, married, widowed, divorced);
  TPerson = record
    (* PARTIE CONSTANTE *)
    (* les enregistrements peuvent être imbriqués *)
    name: record
	first, middle, last: string;
    end;
    sex: (male, female);
    (* date de naissance *)
    dob: TDateTime;
    (* PARTIE VARIABLE *)
    case maritalStatus: maritalStates of
      unmarried: ( );
      married, widowed: (marriageDate: TDateTime);
      divorced: (marriageDate, divorceDate: TDateTime;
				isFirstDivorce: boolean)			
  end;

Ce dernier type d'enregistrement est appelé enregistrement avec variantes. La variable (facultative) qui suit le case est appelé discriminant. Le type seul peut être mentionné s'il n'est pas besoin de manipuler le discriminant dans le code. Dans un enregistrement, on ne peut avoir qu'une seule partie variable qui doit se trouver à la fin de cet enregistrement ; rien n'empêche cependant d'imbriquer des enregistrements avec variantes... La taille du type est égale à la somme de celle de la partie fixe et de celle de la partie variante la plus grande. Attention : comme les différentes alternatives se superposent en mémoire, l'affectation des champs d'une variante modifie le contenu des champs des autres variantes sans vérifier la cohérence de ces changements.

Enregistrement avancé

Un enregistrement avec des méthodes et des propriétés.

  • Souvenez-vous qu'il faut ajouter la directive de compilation {$MODESWITCH ADVANCEDRECORDS}.

Adressage

Champs

On accède aux champs en plaçant un point entre le nom de l'enregistrement et le nom du champ, ainsi :

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

Éventuellement, l'accès aux groupes de champs peut être effectué sans répéter le nom de l'enregistrement à l'aide de la construction with :

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

Instances

Un enregistrement est traité par le programme comme une entité entière. Par exemple, un enregistrement entier peut être copié dans un autre de même type à l'aide d'une seule affectation :

var
  a, b: TMember;

(* programme principal *)
begin
  { ... affecte les valeurs vers le champs de a dans l'enregistrement b .. }
  b := a
  { maintenant b contient la copie de a }
  { à ne pas confondre avec les références : }
  { a et b sont des entités différentes de TMember }
end.

Enregistrement constant

type
  //record declaration
  TSpecialDay = record
    DayName : string;
    month : integer;
    day : integer;
  end;

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

Voir aussi

Types de données
Types de données simples Boolean | Byte |Cardinal | Char | Currency | Extended | Int64 | Integer | Longint | Pointer | Real | Shortint | Smallint | Word
Types de données complexes Array | Class | Record | Set | String | ShortString