Вы можете использовать RTTI для записи имен перечислений.
Вот оптимизированная функция, которую я написал некоторое время назад:
program hours;
{$APPTYPE CONSOLE}
uses
SysUtils;
function GetEnumName(aTypeInfo: pointer; aIndex: integer): PShortString;
asm // get enumerate name from RTTI
or edx,edx
movzx ecx,byte ptr [eax+1] // +1=TTypeInfo.Name
mov eax,[eax+ecx+1+9+1] //BaseType
mov eax,[eax]
movzx ecx,byte ptr [eax+1]
lea eax,[eax+ecx+1+9+4+1] // eax=EnumType.BaseType^.EnumType.NameList
jz @0
@1: movzx ecx,byte ptr [eax]
dec edx
lea eax,eax+ecx+1 // next short string
jnz @1
@0:
end;
type
TypeDay = (Sun,Mon,Tue,Wed,Thu,Fri,Sat);
var day: TypeDay;
begin
for day := Sun to Sat do
begin
writeln(GetEnumName(TypeInfo(TypeDay),ord(day))^);
end;
end.
Но учтите, что эта версия не проверяетчто индекс должен быть в диапазоне.