Frage

Ich habe den folgenden Enum -Typ deklariert, in dem ich möchte, dass das erste Mitglied den Ordnungswert von 1 (eins) und nicht die übliche 0 (Null) hat:

  type
    TMyEnum = (
               meFirstValue = 1,
               meSecondValue,
               meThirdValue
              );

Wenn ich anrufe Typinfo (), zB als Teil eines Aufrufs zu Getenumname (), Ich bekomme einen Compiler -Fehler:

  GetEnumName(TypeInfo(TMyEnum), Ord(aValue));

Fehler: "E2134: Typ 'tMyenum' hat kein Typinfo"

Warum ist das?

Ich weiß, dass Klassen nur Typinfo haben, wenn sie mit dem zusammengestellt werden $ M Compiler -Option aktiviert oder (abgeleitet von einer Klasse, die war, wie z. Tpersistent) Aber ich dachte nicht, dass es besondere Bedingungen gibt, um Typinfo für Enum -Typen zu haben.

War es hilfreich?

Lösung 2

Typinformationen werden für Enums nicht unterstützt, bei denen bestimmte Ordnungswerte zugewiesen werden, die dazu führen, dass Enum -Mitglieder Ordnungswerte haben, die sich von denen unterscheiden, die normalerweise vom Compiler zugewiesen werden.

Wenn bestimmte Werte essentiell oder wünschenswert sind, müssen "nicht verwendete" Enum -Mitglieder nach Bedarf in "Pad" den Aufzähler eingefügt werden. EG (zusätzliche Eindrücke nur für Betonung):

  type
    TMyEnum = (
                meNOTUSED1,   {= 0}
               meFirstValue,  {= 1} 
               meSecondValue,
               meThirdValue
              );

Mit einem Unterabschnitt kann dann den nicht verwendeten Anfangswert "Filmen" "herausfiltern":

   TValidMyEnum = meFirstValue..meThirdValue;

Sie möchten zwar möglicherweise in Betracht ziehen, den ursprünglichen Enum -Typ umzubenennen, damit Ihr Unterberiefungstyp während Ihres gesamten Projekts verwendet wird.

Ein Unterbereich ist nicht ausreichend, wenn die Enum "Lücken" enthält:

  type
    TMyEnum = (
                meNOTUSED1,   {= 0}
               meFirstValue,  {= 1} 
               meSecondValue,
               meThirdValue,
                meNOTUSED2,
               meFinalValue   {= 5}
              );

In diesem Fall gibt es keine einfache Möglichkeit, die Überprüfung der Kompilierungszeitbereiche zu erweitern, um die nicht verwendeten Mitglieder auszuschließen, aber einige festgelegte Typen vereinfachen das Geschäft der Implementierung aller erforderlichen Laufzeit Überprüfungen:

  type
    TMyEnums = set of TMyEnum;

  const
    meNOTUSED      = [meUNUSED1, meUNUSED2]; //  .. etc as required
    meValidValues  = [Low(TMyEnum)..High(TMyEnum)] - meNOTUSED;


  if NOT (aValue in meValidValues) then
     // etc

Andere Tipps

Ablangen Aufzählungen und Aufzählungen, die nicht mit Null beginnen, haben nicht typeInfo. Damit die Typinfo implementiert werden muss, müsste es aufgrund von Probleme mit Rückwärtskompatibilität in einem anderen Format als vorhandene TKENumeration sein.

Ich habe überlegt, eine TKDISContuituNumeration (oder möglicherweise besser benannte Mitglied) für Delphi 2010 umzusetzen, aber der Nutzen schien in Anbetracht ihrer relativen Knappheit und den Schwierigkeiten bei der Aufzählung gering zu sein - wie kodieren Sie die Bereiche effizient? Einige Kodierungen sind für einige Szenarien besser, schlimmer für andere.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top