2017-09-29 4 views
0

Pour les énumérations normales que je peux faire une boucle à travers et obtenir tous les noms:Type Itérer throught enum avec constante assignée et obtenir son nom

type 
    TMyEnum = (apple, pear, plum); 

procedure TForm2.FormCreate(Sender: TObject); 
var 
    i: TMyEnum; 
    s: String; 
begin 
    s:= ''; 
    for I := Low(TMyEnum) to High(TMyEnum) do 
    begin 
    s := s + TRttiEnumerationType.GetName<TMyEnum>(i) + sLineBreak; 
    end; 
    ShowMessage(s); 
end; 

Mais, pour:

TMyEnum = (apple=5, pear=20, plum=70); 
  1. Comment itérer à travers cela?
  2. Comment obtenir les noms via RTTI?
+0

oui, sans constantes assignée il est ok, mais avec une constante, il soulever erreur [Erreur dcc32] Unit2.pas (41): Type E2134 « TMyEnum » n'a pas d'info type – Livius

+1

Limitation connue: les déclarations enum avec des constantes n'obtiennent pas de RTTI. Probablement préférable d'utiliser un tableau de conversion ici: –

Répondre

2

Les types d'énumération déclarés avec des valeurs constantes n'obtiennent pas de RTTI, de sorte que cela ne peut pas fonctionner. En fonction de vos besoins cela pourrait être une alternative:

type 
    TMyEnum = (apple, pear, plum); 

    TMyEnumHelper = record helper for TMyEnum 
    private const 
    cEnumInt: array[TMyEnum] of Integer = (5, 20, 70); 
    public 
    function GetAsInteger: Integer; 
    procedure SetAsInteger(const Value: Integer); 
    property AsInteger: Integer read GetAsInteger write SetAsInteger; 
    end; 

function TMyEnumHelper.GetAsInteger: Integer; 
begin 
    Result := cEnumInt[Self]; 
end; 

procedure TMyEnumHelper.SetAsInteger(const Value: Integer); 
var 
    I: TMyEnum; 
begin 
    for I := Low(cEnumInt) to High(cEnumInt) do begin 
    if cEnumInt[I] = Value then begin 
     Self := I; 
     Exit; 
    end; 
    end; 
    raise ERangeError.Create('not a valid enum value'); 
end; 
+2

Sûrement que c'est un dupe plusieurs fois –

+1

Voir [Boucle par énumération irrégulière dans Delphi] (https://stackoverflow.com/q/4132717/576719) –

+0

Je suppose que la réponse dans ce lien est le meilleur dans le scénario de l'absence de cette fonctionnalité dans Delphi lui-même – Livius