CONSERVER LES NOMS DE DÉFINITION D'UN TYPE ÉNUMÉRÉ

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 21 janv. 2003 à 23:02
randry2004 Messages postés 2 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 24 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.

https://codes-sources.commentcamarche.net/source/12313-conserver-les-noms-de-definition-d-un-type-enumere

randry2004 Messages postés 2 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 24 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és 32 Date d'inscription vendredi 14 février 2003 Statut Membre Derniè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és 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
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és 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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és 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
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és 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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;

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".
Rejoignez-nous