Einzelnen Beitrag anzeigen

freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
272 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Automatischer Setter/Getter für Aufzählungs-Variablen via RTTI?

  Alt 17. Okt 2017, 15:38
Ungetestet EntHTMLisiert und GeShowMessaged
Delphi-Quellcode:
uses
  Classes,
  TypInfo;

{ Die Prozedur liefert Informationen zum übergebenen Aufzählungstypen. }
procedure TRTTI.GetEnumTypeInfo(AClass: TObject);
begin
  GetEnumTypeInfo(PTypeInfo(AClass));
end;

{ Die Prozedur liefert Informationen zum übergebenen Aufzählungstypen. }
procedure TRTTI.GetEnumTypeInfo(ATypeInfo: PTypeInfo);
var
  OrdTypeData : PTypeData;
  TypeNameStr : String;
  TypeKindStr : String;
  MinVal : Integer;
  MaxVal : Integer;
  i : integer;
begin
  // TTypeData-Pointer holen
  OrdTypeData := GetTypeData(ATypeInfo);
  // Typnamen holen
  TypeNameStr := ATypeInfo.Name;
  // Typart als String holen
  TypeKindStr := GetEnumName(TypeInfo(TTypeKind), Integer(ATypeInfo^.Kind));
  // Niedrigsten und höchstmöglichen Wert holen
  MinVal := OrdTypeData^.MinValue; // Kleinster Wert
  MaxVal := OrdTypeData^.MaxValue; // Höchster Wert
  // Type Name = TypeNameStr
  // Type Kind = TypeKindStr
  If ATypeInfo^.Kind in [tkInteger, tkChar, tkEnumeration, tkFloat, tkInt64] Then Begin
    if (ATypeInfo^.Kind = tkEnumeration) And (UpperCase(TypeNameStr) <> 'WORDBOOL') then Begin
      Try
        // Eigentlich sollte man meinen, das MinVal kleiner als MaxVal ist,
        If MinVal < MaxVal Then Begin
          for i := MinVal to MaxVal do Begin
            // Verbale Beschreibung = GetEnumName(ATypeInfo, i) // Also z. B. Hund
            ShowMessage(GetEnumName(ATypeInfo, i));
          End;
        End Else Begin // ist es aber bei TOleEnum nicht
          for i := MinVal Downto MaxVal do Begin
            // Verbale Beschreibung = GetEnumName(ATypeInfo, i) // Also z. B. Hund
            ShowMessage(GetEnumName(ATypeInfo, i));
          End;
        End;
      Except
        // Fehlerbehandlung
      End;
    End;
  End;
end;
Oh danke! Das wär doch nicht nötig gewesen...
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat