jlen100
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
13
24 mars 2006 à 20:59
le type record de dephi (pascal) et la structure du 'C' sont
équivalentes et ont accède à un élément du record en mettant un point
entre le nom et le champ
voici ce dit l'aide:
Un enregistrement (appelé aussi structure dans certains langages)
représente un ensemble de données hétérogènes. Chaque élément est
appelé un champ ; la déclaration d'un type enregistrement spécifie le
nom et le type de chaque champ. Une déclaration de type enregistrement
a la syntaxe suivante :
type nomTypeEnregistrement = record
listeChamp1: type1;
...
listeChampn: typen;
end
où nomTypeEnregistrement est un identificateur valide et où chaque type
désigne un type, et chaque listeChamp est un identificateur valide ou
une liste d'identificateurs délimitée par des virgules. Le
point-virgule final est facultatif.
Par exemple, la déclaration suivante crée un type enregistrement nommé TDateRec.
type
TDateRec = record
Annee: Integer;
Mois: (Jan, Fev, Mar, Avr, Mai, Jun,
Jul, Aou, Sep, Oct, Nov, Dec);
Jour: 1..31;
end;
Chaque TDateRec contient trois champs : une valeur entière appelée
Annee, une valeur d'un type énuméré appelé Mois et une autre valeur
entière comprise entre 1 et 31 appelée Jour. Les identificateurs Annee,
Mois et Jour sont des noms de champs de TDateRec qui se comportent
comme des variables. Néanmoins, la déclaration de type TDateRec
n'alloue pas de mémoire pour les champs Annee, Mois et Jour ; la
mémoire est allouée quand vous instanciez l'enregistrement, de la
manière suivante :
var Record1, Record2: TDateRec;
Cette déclaration de variable crée deux instances de TDateRec, appelées Record1 et Record2.
Vous pouvez accéder aux champs de l'enregistrement en qualifiant le nom de champ avec le nom de l'enregistrement :
Record1.Annee := 1922;
Record1.Mois := Nov;
Record1.Jour := 26;
Ou en utilisant une instruction with :
with Record1 do
begin
Annee := 1922;
Mois := Nov;
Jour := 26;
end;
Vous pouvez alors copier les valeurs des champs de Record1 dans Record2 :
Record2 := Record1;
Comme la portée d'un nom de champ est limitée à l'enregistrement dans
lequel il est spécifié, vous n'avez pas à vous préoccuper de conflits
entre les noms de champ et des noms de variable.
Au lieu de définir des types d'enregistrement, vous pouvez utiliser
directement la construction record ... dans des déclarations de
variable :
var S: record
Nom: string;
Age: Integer;
end;
Cependant, une telle déclaration annule complètement les avantages des
enregistrements, à savoir éviter le codage répétitif de groupes de
variables identiques. De plus, des enregistrements déclarés séparément
avec cette méthode ne sont pas compatibles pour l'affectation même si
leur structure est identique.
pour ton utilisation tu peux soit rouvrir le fichier à chaque utilisation soit l'ouvrir dans un liste
par exemple:
type
Pcell=^Rcell;/ /type pointeur sur la structure RCell
RCell = record// pas de changement
Grafcet : word; (* Indice des grafcet partiel *)
Page : byte; (* Indice de la page graphique *)
Couleur : byte; (* Couleur pour l'objet graphique *)
Nature : byte; (* Nature de l'objet graphique *)
Connexion : byte; (* Nature de la connectivité avec les cellules voisines *)
Convergence : word; (* Gestion de la convergence *)
Indice : smallint; (* Indice numérique associé à l'objet *)
Extension :integer ; (* Pointeur vers chaîne de caractères associée *)
end;
var ListePoints: = Tlist; //on déclare une variable liste
Fichier : file of PCell;
Procedure TForm1.create(Sender: TObject);
begin
ListePoints: = Tlist.Create;//on crée la liste
end ;
dans la procedure de chargement à ne faire qu'une seule fois
procedure open;
var enregistrement:PCell;//on déclare une variable pointeur
begin
assignfile(fichier,'nomdufichier');
reset(fichier);
while not(EOF(fichier)) do
begin
new(enregistrement);//on assigne une nouvelle variable enregistrement
ListePoints.Add(P);// on l'ajoute à la liste (l'adresse seulement)
read(fichier,enregistrement^);//ne pas oublier le ^ on écrit dans la zone mémmoire pointée
end,
closefile(fichier);
end;
pour utiliser la liste
procedure utiliseliste;
var enregistrement:PCell;//on déclare une variable pointeur
i:integer;
begin
for i: = 0 to ListePoints.count-1 do //pour lire la liste du début à la fin:
begin
enregistrement: = ListePoints.Items[i]; //on l'utilise comme un tableau ; on peut récupérer la variable en la pointant directement
with enregistrement^ do// autre façon d'accéder aux champs sans avoir à écrire chaque fois enregistrement.nomdu champ;
begin
nature: =XXXXX;
Page := ZZZZZ;
end ;
end;
end;
en sortie il faut libérer la mémoire proprement:
procédure TForm1.close(Sender: TObject);
var enregistrement:PCell;//on déclare une variable pointeur
i:integer;
begin
for i: =0 to ListePoints.Count-1 do
begin
enregistrement:=ListePoints.Items[i]; //on récupère l'adresse de la variable
dispose(enregistrement);//on libère la mémoire
end;
ListePoints.Free;//on libère la liste
end;
on peut ainsi travailler sur le fichier sans avoir à le recharger
@+
jlen