kalerzz
Messages postés10Date d'inscriptionlundi 16 février 2004StatutMembreDernière intervention18 mai 2006
-
16 mai 2006 à 22:15
kalerzz
Messages postés10Date d'inscriptionlundi 16 février 2004StatutMembreDernière intervention18 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 ?
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 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
@+
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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.
kalerzz
Messages postés10Date d'inscriptionlundi 16 février 2004StatutMembreDernière intervention18 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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.