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.