Initialisation d'un enregistrement [Résolu]

Messages postés
10
Date d'inscription
lundi 16 février 2004
Dernière intervention
18 mai 2006
- - Dernière réponse : kalerzz
Messages postés
10
Date d'inscription
lundi 16 février 2004
Dernière intervention
18 mai 2006
- 18 mai 2006 à 17:11
Bonjour à tous (et à toutes !),

Je vais peut être me faire renvoyer sur la doc de Delphi ou sur Google, mais je n'ai trouvé aucune information quant à l'initialisation d'une variable de type enregistrement...

Voilà mon problème concrètement :

// je déclare un type enregistrement
type TEnregistrement = record
  nom: string[20];
  entier: integer;
end;
// je déclare un tableau d'enregistrements TEnregistrment
TTabEnregistrement = Array [1..5] of TEnregistrement;

Mais je n'arrive pas à initialiser en dur dans une procedure le tableau directement...
Est-ce que cela est possible ?

 
Merci d'avance pour vos réponses !
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
329
Date d'inscription
lundi 30 décembre 2002
Dernière intervention
10 mars 2012
3
Merci
Salut,

dans les compilateurs/decompilateurs ainsi que dans beaucoup d'Applications il est parfois utile de créer un lookup, dans ce cas là ton tableau devrait-être déclarer comme constante donc on ne pourrat plus modifié l'enregistrement

exemple:

Type
TEnregistrement = record
Name : String;
Index : integer;
end;
// je déclare un tableau d'enregistrements TEnregistrment

Const
MaxTabReg = 2
TTabEnregistrement : array [1..MaxTabReg] of TEnregistrement =(
(Name : 'Delphi' ; Index : 1) ,
(Name : 'C++' ; Index : 2)
);

Type <== si par la suite il ya une autre classe dans la déclaration, il faudra remettre 'Type'
....
ensuite pour une recherche

FindIndex(AName : String):Integer;
var
i : Integer;
Enr : TTabEnregistrement;
begin
result := 0;
for i :=1 to High(TTabEnregistrement) do
begin
Enr := TTabEnregistrement[i];
if SameText(Enr.Name , AName) then // on compare le nom
begin
result := Enr.Index;
Break;// on sort de la boucle i
end;
end;//i++
end;

Nota: SameText se trouve dans l'unité SysUtils, dans il faudra l'inclure dans la clause uses si ce n'est pas déja fait !!!, de plus SameText ne prend pas en considération la casse des Strings , donc les Minuscules/Majuscules n'ont aucun effet sur cette fonction !!!

maintenant il existe une méthode par très propre .... qui permet de modifié les constantes !!!!

pour celà il suffit d'ajouter une directive lors de la déclaration du tableau

Const
MaxTabReg = 2

{$J+} <=== constante modifiable
TTabEnregistrement : array [1..MaxTabReg] of TEnregistrement =(
(Name : 'Delphi' ; Index : 1) ,
(Name : 'C++' ; Index : 2)
);
{$J-}

maintenant on peut modifié le tableau !!! grâce à la directive J+ voir l'aide de Delphi en tapant $WRITEABLECONST où $J
@+

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 119 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_shining
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
39
0
Merci
Salut,
Voici deux possibilités mais ils en existent d'autres

Var TabEnregistrement : TTabEnregistrement;

Procedure Init_Tab;
Var I : Integer;
Begin
  For I := 1 to 5 do
  With TabEnregistrement[I] do
  Begin
    Nom : = '';
    Entier := 0;
  End ;
End;

ou pour écrire dans un élément du tableau :

Procedure Write_Tab(Var aTab : TEnregistrement; aName : String; aInt : Integer)
Begin
  With aTab  do
  Begin
    Nom : = aName ;
    Entier := aInt;
  End;
End;

Utilisation :

Write_Tab(TabEnregistrement[2], 'DelphiFr', 10);

Voilà,
  bonne prog et

@+
Cirec
Commenter la réponse de Cirec
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
11
0
Merci
Bonjour,


Ou très simplement :


TTabEnregistrement[1].Nom:= 'moi';

TTabEnregistrement[2].Nom:= 'toi';

TTabEnregistrement[3].Nom:= 'vous';

TTabEnregistrement[4].Nom:= 'nous';

TTabEnregistrement[5].Nom:= 'ils';

TTabEnregistrement[1].Entier:= 1;


TTabEnregistrement[2].Entier:= 2;




TTabEnregistrement[3].Entier:= 3;




TTabEnregistrement[4].Entier:= 4;

TTabEnregistrement[5].Entier:= 5;


Brem. Un peu trops simple même.


Par contre il faut faire attention à la chaîne de taille 20 si tu
permet à l'utilisateur d'entrer un nom. Si le tableau s'arrête à 5, il
serait peu être plus simple d'utiliser des chaînes dynamiques, plus
lentes, mais au combien plus sécurisantes.
Commenter la réponse de cs_rt15
Messages postés
10
Date d'inscription
lundi 16 février 2004
Dernière intervention
18 mai 2006
0
Merci
Salut,

Donc l'idée serait d'utiliser une procédure d'affectation avec les caractéristiques de l'enregistrement passés en paramètres...
Il n'y a donc pas d'astuce pour affecter directement du style :

Rec: TEnregistrement;
Rec:= ('moi', 1); ou Rec:= TEnregistrement'('moi', 1);

Comme cela pourrait se faire dans d'autres langages ?

Cela dit, la deuxième solution proposée s'avère à mon avis un tantinet trop longue compte tenu du fait que dans mon application il y aura une 80aine d'enregistrements...
Toujours pour rt15, comment qu'entends-tu par liste dynamique, les pointeurs ?
Mais de toutes façons, les enregistrements seront faits par mes soins, donc pas de soucis à priori, si ?

En tous cas, merci beaucoup pour vos réponses.
Commenter la réponse de kalerzz
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
11
0
Merci
Non désolé, je connais pas d'astuce...

Si tu as 80 enregistrements, tu coderas effectivement plus vite si tu utilises la méthode de cirec, qui reviens au même qu'une astuce. M'enfin, ça fait quand même des appelles de fonctions, des affectations... Y a un truc qui m'échappe...

Bon déjà, pour accélérer le mouvement, tu peut gérer les enregistrement en les claquants dans un TStream (Ou descendant). cf l'aide de Delphi. (par contre, c'est vrai que ça, ça se gère beaucoup plus facilement avec des chaînes de caractère de taille fixe.

Pour les chaîne dynamiques :

type TEnregistrement = record
  nom: string;
  entier: integer;
end;

Et voilou !

Delphi s'occupe de toutes les allocations, et tu n'as plus de risque de dépasser la limite des 20 caractères. Mais en contre partie, tu consomme plus de CPU à cause de l'allocation. En même temps, 80 enregistrements, c'est pas la BDD de la sécu.

C'est à peu près le même type qu'en VB si tu connais.

Mais pas de souci si tu rempli tes enregistrements.

Je suis plus très réveillé, donc hésite pas si tu veux des précisions.
Commenter la réponse de cs_rt15
Messages postés
10
Date d'inscription
lundi 16 février 2004
Dernière intervention
18 mai 2006
0
Merci
Ah oui je ne sais pas pourquoi je n'ai pas pensé au type string simple...

Je vais essayer de trouver des informations sur le type TStream !

Merci beaucoup, bonne nuit ;)
Commenter la réponse de kalerzz
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
11
0
Merci
Bah là voilà l'astuce !

Merci shining !
Commenter la réponse de cs_rt15
Messages postés
10
Date d'inscription
lundi 16 février 2004
Dernière intervention
18 mai 2006
0
Merci
Perfecto shining !

C'est nickel, tout marche pour le mieux, merci beaucoup pour ton astuce et tes explications...

Merci encore aux autres aussi !
Commenter la réponse de kalerzz

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.