CONSERVER LES NOMS DE DÉFINITION D'UN TYPE ÉNUMÉRÉ
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
21 janv. 2003 à 23:02
randry2004
Messages postés2Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention24 mars 2006
-
24 mars 2006 à 11:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
randry2004
Messages postés2Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention24 mars 2006 24 mars 2006 à 11:49
Bonjour, j'aimerai créer une fonction du genre
function TypeToStr( ValeurLittDuTypeEnum : [?]): String;
en travaillant sur le GetEnumValue et le GetEnumName, le soucis c'est que je ne sais pas récuperer le type , En fait ce que je veux c'est mettre en paramètre la valeur enumerée et avoir en sortie le String correspondant, pouvez vous m'aider!
merci
cbonus2000
Messages postés32Date d'inscriptionvendredi 14 février 2003StatutMembreDernière intervention 2 décembre 2009 13 mai 2004 à 22:36
Question:
Est-ce qu'il y a moyen d'aller chercher toutes les propriétés de type string d'une classe?
Par exemple, la classe TFORM, aller chercher au RunTime ces propriétés de type string tel que: Caption, Hint, Name, etc...
Je ne crois pas que ma question est directement lié à cette source mais....peut-être que quelqu'un avec votre bagage d'expérience....
cs_Nono40
Messages postés962Date d'inscriptionmercredi 3 avril 2002StatutMembreDernière intervention12 septembre 20062 22 janv. 2003 à 00:14
Ben quand on regarde le source de GetEnumValue il semble que si. GetEnumValue appelle la fonction GetEnumNameValue qui retourne -1 si la chaine n'est pas trouvée :
...
{ we haven't found the thing - return -1 }
@notFound:
OR EAX,-1
@exit:
POP EDI
POP ESI
POP EBX
end;
Par contre -1 peut aussi être retourné pour la valeur True des type LongBool WordBool ou ByteBool.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 21 janv. 2003 à 23:59
GetEnumValue ne retourne pas toujours -1. Celà dépend du type de données examinées.
D'autre part, j'ai oublié de préciser que GetEnumValue n'est pas sensible à la casse en ce qui concerne le deuxième paramètre.
Pour info : ces routines existent depuis Delphi 2. Seulement, Borland ne semble pas avoir jugé utile de documenter l'unité TypInfo.Pas.
Et pourtant, ils font souvent allusion aux RTTI (RunTime Type Information) dans leur manuels.
cs_Nono40
Messages postés962Date d'inscriptionmercredi 3 avril 2002StatutMembreDernière intervention12 septembre 20062 21 janv. 2003 à 23:30
Très bonne remarque, je vais de ce pas modifier le source.
Juste un détail, GetEnumValeu retourne -1 si le nom n'est pas trouvé.
Je suis d'accord que ce n'est pas très utile, mais il y a un cas qui va me servir. J'utilise régulièrement les type énumérés et pour des besoin d'affichage j'avais recours à un Case ou un tableau de chaine constant. Mais dans les deux cas il fallait maintenir le case ou le tableau quand le type énuméré était modifié. Avec cette astuce ce n'est plus nécessaire.
Il est vrai que cela fonctionne aussi sans la directive $M, cela me semblait nécessaire dans ce cas... Je décourve le sujet...
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 21 janv. 2003 à 23:02
Si GetEnumName renvoie une valeur littérale, il y a aussi la réciproque : GetEnumValue. Ci-après une démonstration :
uses
TypInfo;
type
TTestEnum =(Un, Deux, Trois, Quatre, Cinq, Six, Sept, Huit, Neuf);
const
TabTestEnum : array[TTestEnum] of String=
('Un','Deux','Trois','Quatre','Cinq','Six','Sept','Huit','Neuf');
procedure TForm1.Button1Click(Sender: TObject);
begin
TrackBar1.Position := GetEnumValue(TypeInfo(TTestEnum), Edit1.Text);
Edit1.SelectAll;
end;
GetEnumValue admet deux paramètres :
1- un pointeur sur une type énuméré
2- l'équivalent en chaîne de la valeur recherchée
et renvoie un integer indiquant la valeur ordinale dans le type énuméré ou zéro s'il n'a rien trouvé.
L'utilisation de la directive $M n'est pas indispensable ici. Je ne l'ai jamais utilisée et Borland me rassure en écrivant "Une application utilise directement l'indicateur $M de compilation très rarement, si ce n'est jamais".
24 mars 2006 à 11:49
function TypeToStr( ValeurLittDuTypeEnum : [?]): String;
en travaillant sur le GetEnumValue et le GetEnumName, le soucis c'est que je ne sais pas récuperer le type , En fait ce que je veux c'est mettre en paramètre la valeur enumerée et avoir en sortie le String correspondant, pouvez vous m'aider!
merci
13 mai 2004 à 22:36
Est-ce qu'il y a moyen d'aller chercher toutes les propriétés de type string d'une classe?
Par exemple, la classe TFORM, aller chercher au RunTime ces propriétés de type string tel que: Caption, Hint, Name, etc...
Je ne crois pas que ma question est directement lié à cette source mais....peut-être que quelqu'un avec votre bagage d'expérience....
22 janv. 2003 à 00:14
...
{ we haven't found the thing - return -1 }
@notFound:
OR EAX,-1
@exit:
POP EDI
POP ESI
POP EBX
end;
Par contre -1 peut aussi être retourné pour la valeur True des type LongBool WordBool ou ByteBool.
21 janv. 2003 à 23:59
D'autre part, j'ai oublié de préciser que GetEnumValue n'est pas sensible à la casse en ce qui concerne le deuxième paramètre.
Pour info : ces routines existent depuis Delphi 2. Seulement, Borland ne semble pas avoir jugé utile de documenter l'unité TypInfo.Pas.
Et pourtant, ils font souvent allusion aux RTTI (RunTime Type Information) dans leur manuels.
21 janv. 2003 à 23:30
Juste un détail, GetEnumValeu retourne -1 si le nom n'est pas trouvé.
Je suis d'accord que ce n'est pas très utile, mais il y a un cas qui va me servir. J'utilise régulièrement les type énumérés et pour des besoin d'affichage j'avais recours à un Case ou un tableau de chaine constant. Mais dans les deux cas il fallait maintenir le case ou le tableau quand le type énuméré était modifié. Avec cette astuce ce n'est plus nécessaire.
Il est vrai que cela fonctionne aussi sans la directive $M, cela me semblait nécessaire dans ce cas... Je décourve le sujet...
21 janv. 2003 à 23:02
uses
TypInfo;
type
TTestEnum =(Un, Deux, Trois, Quatre, Cinq, Six, Sept, Huit, Neuf);
const
TabTestEnum : array[TTestEnum] of String=
('Un','Deux','Trois','Quatre','Cinq','Six','Sept','Huit','Neuf');
procedure TForm1.Button1Click(Sender: TObject);
begin
TrackBar1.Position := GetEnumValue(TypeInfo(TTestEnum), Edit1.Text);
Edit1.SelectAll;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
TrackBar1.Max := Ord(High(TTestEnum));
TrackBar1.Min := Ord(Low(TTestEnum));
end;
GetEnumValue admet deux paramètres :
1- un pointeur sur une type énuméré
2- l'équivalent en chaîne de la valeur recherchée
et renvoie un integer indiquant la valeur ordinale dans le type énuméré ou zéro s'il n'a rien trouvé.
L'utilisation de la directive $M n'est pas indispensable ici. Je ne l'ai jamais utilisée et Borland me rassure en écrivant "Une application utilise directement l'indicateur $M de compilation très rarement, si ce n'est jamais".