Nicht schön aber selten... Bei neueren Delphi-Versionen muß man die Byte-typen evtl. durch Word ersetzen.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
Shift : TShiftState;
bMin, bMax : Byte;
bShift : Byte;
b : Byte;
s : string;
begin
// das hier wollen wir untersuchen
Shift := [ssAlt, ssCtrl, ssShift];
// Umwandeln damit's geht. Hier der Einfachheit halber fest als Byte, sonst über OrdType unterscheiden
bShift := byte(Shift);
// Über TypInfo den Bereich holen
bMin := GetTypeData(GetTypeData(TypeInfo(TShiftState))^.CompType^)^.MinValue;
bMax := GetTypeData(GetTypeData(TypeInfo(TShiftState))^.CompType^)^.MaxValue;
// Iterieren über das Set
for b := bMin to bMax do
begin
// Ist das drin?
if bShift and (1 shl b) <> 0 then
// Dann Namen holen
s := s + ' '+ GetEnumname(GetTypeData(TypeInfo(TShiftState))^.CompType^, b);
end;
ShowMessage(s);
end;