Listes énumérées : concaténation et utilisation des fonctions de typeinfo

Soyez le premier à donner votre avis sur cette source.

Vue 3 403 fois - Téléchargée 448 fois

Description

Un Type Enuméré peut avoir 4 milliards de valeurs tandis qu'un type Enuméré utilisé dans un Ensemble ne peut avoir que 256 valeurs

Or la fonction GetEnumName(TypeInfo, index) de l'unité TypeInfo ne peut que donner la position d'un élément de la liste qui lui est transmise.
De plus, on ne peut pas concaténer les listes d'énumérés comme des ensembles,il faut trouver un autre mécanisme.

C'est ce que je propose ici en concaténant tous les éléments de toutes les listes dans un stringList. Cela permet de travailler sur l'ensemble des items de toutes les listes prédéfinies

Les fonctions spécifiques de la RTTI (Run-Time Type Information) existe depuis Delphi 2 mais n'ont été publiées qu'avec Delphi 4 avec l'unité TypInfo de Borland.
La RTTI génère des informations en provenance du compilateur et la documentation est peu fournie.

Avec Delphi XE2 de Embarcadero, on les retrouve également dans System.TypInfo ... Il y a peu de nouveautés semble t-il par rapport à D7

Source / Exemple :


L'exemple permet de traiter 3 listes différentes d'énumérés comme une seule liste. On utilise pour cela une StringList. 

A = (a1,a2,a3);  => Création TList => permet de gérer A Union B
B = (b1,b2);

Il y a une autre méthode (non incluse dans le source que m'a rappelé Caribensila sur le Forum et qui effectivement est souvent utilisée pour les petites listes.

A = (a1=1,a2=2,a3=3);  => L'indexation permet de gérer A Union B
B = (b1=4;b2=5);

Les fonctions utilisées dans l'exemple sont :
                                    - GetEnumName
                                         avec sa structure TypeInfo
                                    - GetEnumValue
                                    - GetTypeData
                                         avec ses structures et pointeurs:
                                         PTypeData
                                         TTypeData
                                         TTypeKing

Conclusion :


Traiter plusieurs listes d'énumérés comme une seule liste trouve son intérêt (non exploré dans l'exemple) me semble t-il dans plusieurs domaines tels que :
- optimisation du codage de nombreux éléments
- facilitation de la maintenance du code d'une application importante
- possibilité de gérer des Arborescences quelconques et des structures hiérarchisées

La solution avec une TStringList (ou une listBox) ne me satisfait pas pleinement. Je cherche une autre solution... Je n'ai pas fini d'exploiter les fonctions de la RTTI. Si vous avez des idées

Si vous avez des solutions...

Codes Sources

A voir également

Ajouter un commentaire

Commentaire

cs_Jean_Jean
Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2 -
En fait, le but recherché est de se creuser la tête pour se passer d'écrire un tas de code pour gérer l'union de plusieurs listes d'énumérés.

Je travaille donc sur l'écriture d'une nouvelle classe, voire une métaclasse (dérivé de TObject). Je ne suis pas sûr d'y arriver, ça devient très abstrait. Ou alors peut-être simplement un composant non visuel (dérivé de TComponent).

Le rôle de composant serait alors d'intégrer automatiquement les listes d'énumérés qu'aura écrit le programmeur sans qu'il ait à réecrire le charabia de la RTTI.

Si un delphiste expérimenté passe par là!
Merci de me faire part de votre reflexion

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.