Comment tester si un élément appartient à une liste énumérée

Résolu
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 - 28 juin 2012 à 17:33
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 - 29 juin 2012 à 09:18
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
A voir également:

3 réponses

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
28 juin 2012 à 19:27
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.
3
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
29 juin 2012 à 09:18
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
3
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
28 juin 2012 à 20:49
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
0
Rejoignez-nous