Initialisation d'un enregistrement [Résolu]

kalerzz 10 Messages postés lundi 16 février 2004Date d'inscription 18 mai 2006 Dernière intervention - 16 mai 2006 à 22:15 - Dernière réponse : kalerzz 10 Messages postés lundi 16 février 2004Date d'inscription 18 mai 2006 Dernière intervention
- 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
cs_shining 329 Messages postés lundi 30 décembre 2002Date d'inscription 10 mars 2012 Dernière intervention - 18 mai 2006 à 00:25
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
@+

Merci cs_shining 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 73 internautes ce mois-ci

Commenter la réponse de cs_shining
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 17 mai 2006 à 00:41
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
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 17 mai 2006 à 18:51
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
kalerzz 10 Messages postés lundi 16 février 2004Date d'inscription 18 mai 2006 Dernière intervention - 17 mai 2006 à 21:48
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
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 17 mai 2006 à 22:30
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
kalerzz 10 Messages postés lundi 16 février 2004Date d'inscription 18 mai 2006 Dernière intervention - 17 mai 2006 à 23:00
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
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 18 mai 2006 à 10:09
0
Merci
Bah là voilà l'astuce !

Merci shining !
Commenter la réponse de cs_rt15
kalerzz 10 Messages postés lundi 16 février 2004Date d'inscription 18 mai 2006 Dernière intervention - 18 mai 2006 à 17:11
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.