2010-10-28 27 views
1

J'ai créé une énumération à l'aide d'une classe descendante TCustomAttribute (TEnumAttribute) pour donner à chaque énumération des données supplémentaires (en cas de succès, elle entraînera un composant personnalisé pouvant interroger une énumération et se peupler en conséquence).Delphi 2010 RTTI: comment interger/explorer une énumération contenant un attribut personnalisé

 

type 
    TShoppingCartType = (

    [TEnumAttribute(0, 'All')] 
    sctAll, 

    [TEnumAttribute(1, 'Web Shopping Cart')] 
    sctWebShoppingCart, 

    [TEnumAttribute(2, 'Wish List')] 
    sctDefaultWebWishList, 

    [TEnumAttribute(3, 'Custom')] 
    sctWebCustomList 

    ); 
 

Je peux obtenir les noms et les valeurs très bien (en utilisant les méthodes TypeInfo GetEnum correspondantes), mais comment puis-je accéder à chaque valeur dans l'énumération et l'accès il est défini attribut?

Merci pour toute information

Répondre

3

Pour autant que je peux voir que vous ne pouvez annoter types avec des attributs. Puisque la valeur d'une énumération n'est qu'une simple valeur ordinale, votre approche ne fonctionne probablement pas.

Si les valeurs enum étaient des types eux-mêmes vous utilisez TRttiContext et TRttiType comme décrit dans les documents officiels:

http://docwiki.embarcadero.com/RADStudio/XE/en/Extracting_Attributes_at_Run_Time

il Faire la façon classique semble être plus approprié:

TShoppingCartTypeDescriptions = array[TShoppingCartType] of string; 

... 

Descriptions: TShoppingCartTypeDescriptions; 
Descriptions[sctAll] := 'All'; 
Descriptions[sctWebShippingCart] := 'Web Shopping Cart'; 
// and so on 

Vous pouvez énumérer toutes les valeurs en utilisant:

var 
    I: TShoppingCartType; 
begin 

    for I := Low(TShoppingCartType) to High(TShoppingCartType) do 
     // Do something with I 

end; 
+0

merci! J'ai probablement passé les 6 dernières heures à jouer avec chaque permutation pour obtenir la (les) valeur (s) correcte (s). J'espérais un «petit tour de main de Marco Cantu» qui n'est pas documenté. :) – KevinRF

+0

@KevinRF: Pas de problème, parfois ce sont les solutions faciles qui fonctionnent le mieux. Vous pouvez également utiliser un dictionnaire ou une autre structure de données intelligente pour résoudre votre problème. –