Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#3

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

  Alt 17. Okt 2017, 14:08
Meinst Du sowas?
Delphi-Quellcode:
uses
  Classes,
  TypInfo;

{ Die Prozedur liefert Informationen zum übergebenen Aufzählungstypen und gibt }
{ diese in der Stringliste zurück.                                             }
procedure TRTTI.GetEnumTypeInfo(AClass: TObject);
begin
  GetEnumTypeInfo(PTypeInfo(AClass));
end;

{ Die Prozedur liefert Informationen zum übergebenen Aufzählungstypen und gibt }
{ diese in der Stringliste zurück.                                             }
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;
  MaxVal := OrdTypeData^.MaxValue;
  // Informationen in Stringliste übernehmen
  FHtml.Add('<ul class="dot">');
  FHtml.Add('<li><em class="Name">Type Name: ' + TypeNameStr + '</em></li>');
  FHtml.Add('<li><em class="Kind">Type Kind: ' + TypeKindStr + '</em></li>');
  // Der gibt zuweilen seltsame Abstürze, das Programm ist einfach weg.
  If ATypeInfo^.Kind in [tkInteger, tkChar, tkEnumeration, tkFloat, tkInt64] Then Begin
    FHTML.Add('<li style="list-style: none">');
    FHtml.Add('<ul class="dot">');
    FHtml.Add('<li><em class="MinMax">Min Val: ' + IntToStr(MinVal) + '</em></li>');
    FHtml.Add('<li><em class="MinMax">Max Val: ' + IntToStr(MaxVal) + '</em></li>');
    // Mögliche Werte und Namen von Aufzählungstypen holen
    // WordBool geht als Aufzählungstyp von -2147483648 bis 2147483647.
    // Das ist etwas zuviel, um alle Werte aufzulisten.
    if (ATypeInfo^.Kind = tkEnumeration) And (UpperCase(TypeNameStr) <> 'WORDBOOL') then Begin
      FHTML.Add('<li style="list-style: none">');
      FHtml.Add('<table class="small">');
      Try
        // Eigentlich sollte man meinen, das MinVal kleiner als MaxVal ist,
        If MinVal < MaxVal Then Begin
          for i := MinVal to MaxVal do Begin
            FHtml.Add('<tr><td class="left" width="10%"><ul class="dot"><li><em class="Value">Value: ' + IntToStr(i) + '</em></li></ul></td>'
                        + '<td class="left" width="30%"><ul class="dot"><li><em class="Value">Name: ' + GetEnumName(ATypeInfo, i) + '</em></li></ul></td></tr>');
          End;
        End Else Begin // ist es aber bei TOleEnum nicht
          for i := MinVal Downto MaxVal do Begin
            FHtml.Add('<tr><td class="left" width="10%"><ul class="dot"><li><em class="Value">Value: ' + IntToStr(i) + '</em></li></ul></td>'
                        + '<td class="left" width="30%"><ul class="dot"><li><em class="Value">Name: ' + GetEnumName(ATypeInfo, i) + '</em></li></ul></td></tr>');
          End;
        End;
      Except
        FHtml.Add('<tr><td>Values nicht zu ermitteln.</td></tr>');
      End;
      FHtml.Add('</table>');
      FHtml.Add('</li>');
    End;
    FHtml.Add('</ul>');
    FHtml.Add('</li>');
  End Else Begin
  End;
  FHtml.Add('</ul>');
end;
Ist ein Fragment aus einer Klasse, mit der ich mir die Dokumantation eines Programmes, einer Klasse ... über RTTI generiere und mit Delphi 7 geschrieben.
  Mit Zitat antworten Zitat