Comment tester si un élément appartient à une liste énumérée [Résolu]

Messages postés
639
Date d'inscription
dimanche 13 août 2006
Dernière intervention
5 mai 2016
- 28 juin 2012 à 17:33 - Dernière réponse :
Messages postés
639
Date d'inscription
dimanche 13 août 2006
Dernière intervention
5 mai 2016
- 30 juin 2012 à 00:02
Bonjour,

Je voudrais trouver une astuce s'il elle existe pour identifier l'appartenance à une liste d'un élément de liste.
Sans passer par un tableau ou un type ensemble!

Type
  TE1 = (e11,e12,e13,e14,e15);
  TE2 = (e21,e22,e23);


Si je teste l'élément e22 avec

For i := Ord(Low(TE1)) to Ord(High(TE1)) do
if TE1(i) = e22 then Pos := i;


Le compilateur refuse me signalant que e22
n'appartient pas à TE1
Et l'encapsulation du code dans un Try..Except ne marche pas non plus!

Peut-être une directive de compilation qui encadrerait le code, mais j'ai pas trouvé!...

Qu'en pensez-vous?

Jean_Jean
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 28 juin 2012 à 19:27
3
Merci
Salut Jean_Jean,

Tu peux attribuer un rang à tes énumérés.

Ce qui donnerait quelque chose comme ça :
Type
  TE1 = (e11=0,e12=1,e13=2,e14=3,e15=4);
  TE2 = (e21=5,e22=6,e23=7);
...
if Ord(e23)<5 then Pos := Ord(e23) else Pos := Ord(e23)-5;


Ou, avec cette technique, quelque chose qui s'adapterait mieux à tes besoins...
A toi de voir.

Merci Caribensila 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 87 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
Messages postés
639
Date d'inscription
dimanche 13 août 2006
Dernière intervention
5 mai 2016
- 29 juin 2012 à 09:18
3
Merci
J'ai trouvé une autre solution en utilisant TSringList.

En effet, les listes d'énumérés en question
sont destinées à faciliter une maintenance de programme. Le fait de rajouter des numéros d'ordre à côté amoindri la lisibilité du code à modifier éventuellement ou même pour un simple ajout.

J'ai donc chercher à me passer de cette numérotation manuelle:

Je procède ainsi:

VAR ListEnum : TStringList;
...
For ii := Ord(Low(TE1)) to Ord(High(TE1)) do
ListEnum.Add(GetEnumName(TypeInfo(TE1),ii));
For ii := Ord(Low(TE2)) to Ord(High(TE2)) do
ListEnum.Add(GetEnumName(TypeInfo(TE2),ii));


L'index d'un élément n'est plus un problème!

Mais je ne trouve pas que le code est vraiment propre,
je cherche donc une autre solution en essayant d'utiliser directement les possibilités de la RTTI
Quant à XE2, à part les possibilités d'utiliser succ et pred, je ne trouve pas grand chose de nouveau

Jean_Jean

Merci cs_Jean_Jean 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 87 internautes ce mois-ci

Commenter la réponse de cs_Jean_Jean
Messages postés
639
Date d'inscription
dimanche 13 août 2006
Dernière intervention
5 mai 2016
- 28 juin 2012 à 20:49
0
Merci
Yo Grand Caribensila!

C'est une solution qui marche en effet sous D7. Merci pour tes lumières!

Je vais quand même essayer de trouver une autre solution avec XE2. J'ai vu qu'ils avait rajouter quelques possibilités...

Je publierai les résultats d'un exemple d'utilisation...
J'accumule les mises à jour! lol on ne s'ennuit pas

Jean_Jean
Commenter la réponse de cs_Jean_Jean
Messages postés
639
Date d'inscription
dimanche 13 août 2006
Dernière intervention
5 mai 2016
- 30 juin 2012 à 00:02
0
Merci
j'ai fait un petit exemple de code ici.

Je suis sur une piste pour me passer également d'une StringList! Avec le type abstrait TObject que je suis obliger d'utiliser pour acquérir le TypeInfo...
ça torture un peu mes neurones...

Jean_Jean
Commenter la réponse de cs_Jean_Jean

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.