Initialisation d'un enregistrement

Résolu
kalerzz Messages postés 10 Date d'inscription lundi 16 février 2004 Statut Membre Dernière intervention 18 mai 2006 - 16 mai 2006 à 22:15
kalerzz Messages postés 10 Date d'inscription lundi 16 février 2004 Statut Membre 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 !

8 réponses

cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
18 mai 2006 à 00:25
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
@+
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
17 mai 2006 à 00:41
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
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
17 mai 2006 à 18:51
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.
0
kalerzz Messages postés 10 Date d'inscription lundi 16 février 2004 Statut Membre Dernière intervention 18 mai 2006
17 mai 2006 à 21:48
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
17 mai 2006 à 22:30
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.
0
kalerzz Messages postés 10 Date d'inscription lundi 16 février 2004 Statut Membre Dernière intervention 18 mai 2006
17 mai 2006 à 23:00
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 ;)
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
18 mai 2006 à 10:09
Bah là voilà l'astuce !

Merci shining !
0
kalerzz Messages postés 10 Date d'inscription lundi 16 février 2004 Statut Membre Dernière intervention 18 mai 2006
18 mai 2006 à 17:11
Perfecto shining !

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

Merci encore aux autres aussi !
0
Rejoignez-nous