delphi-如何获取枚举类型

delphi-如何获取枚举类型,delphi,types,enums,delphi-xe2,Delphi,Types,Enums,Delphi Xe2,我知道如何从整数值中获取枚举值,我有以下代码 function GetEnumValue(intValue:integer):TMyType begin if(ordValue >= Ord(Low(TMyType)))and(ordValue <= Ord(High(TMyType)))then result :=TMyType(ordValue) else raise Exception.Create('ordValue out of TM

我知道如何从整数值中获取枚举值,我有以下代码

function GetEnumValue(intValue:integer):TMyType
begin
   if(ordValue >= Ord(Low(TMyType)))and(ordValue <= Ord(High(TMyType)))then 
      result :=TMyType(ordValue)
   else 
      raise Exception.Create('ordValue out of TMyType range');
end;
函数GetEnumValue(intValue:integer):TMyType 开始
如果(ordValue>=Ord(Low(TMyType)))和(ordValue枚举类型没有基类型,比如TObject是类的基

如果您有一个支持泛型的Delphi版本,那么可以使用下面的帮助程序将序号值转换为枚举值

uses
  System.SysUtils,TypInfo;

Type
  TEnumHelp<TEnum> = record
  type
    ETEnumHelpError = class(Exception);
    class function Cast(const Value: Integer): TEnum; static;
  end;

class function TEnumHelp<TEnum>.Cast(const Value: Integer): TEnum;
var
  typeInf  : PTypeInfo;
  typeData : PTypeData;
begin
  typeInf := PTypeInfo(TypeInfo(TEnum));
  if (typeInf = nil) or (typeInf^.Kind <> tkEnumeration) then
    raise ETEnumHelpError.Create('Not an enumeration type');
  typeData := GetTypeData(typeInf);
  if (Value < typeData^.MinValue) then
    raise ETEnumHelpError.CreateFmt('%d is below min value [%d]',[Value,typeData^.MinValue])
  else
  if (Value > typeData^.MaxValue) then
    raise ETEnumHelpError.CreateFmt('%d is above max value [%d]',[Value,typeData^.MaxValue]);
  case Sizeof(TEnum) of
    1: pByte(@Result)^ := Value;
    2: pWord(@Result)^ := Value;
    4: pCardinal(@Result)^ := Value;
  end;
end;
使用
System.SysUtils,TypInfo;
类型
十帮助=记录
类型
ETEnumHelpError=类(异常);
类函数强制转换(常量值:整数):TEnum;静态;
结束;
类函数TEnumHelp.Cast(常量值:整数):TEnum;
变量
typeInf:PTypeInfo;
typeData:PTypeData;
开始
typeInf:=PTypeInfo(TypeInfo(TEnum));
如果(typeInf=nil)或(typeInf^.Kind tkEnumeration),则
raise ETENUMHELPEROR.Create('不是枚举类型');
typeData:=GetTypeData(typeInf);
如果(ValuetypeData^.MaxValue),则
raise ETENUMHELPEROR.CreateFmt(“%d”高于最大值[%d]”,[value,typeData^.MaxValue]);
案件规模(十)
1:pByte(@Result)^:=值;
2:pWord(@Result)^:=值;
4:pCardinal(@Result)^:=值;
结束;
结束;
例如:

Type
  TestEnum = (aA,bB,cC);

var
  e : TestEnum;
...
e := TEnumHelp<TestEnum>.Cast(2);  // e = cC
类型
睾丸数=(aA、bB、cC);
变量
e:睾丸;
...
e:=TEnumHelp.Cast(2);//e=cC

有一个限制:

不连续或不以零开头的枚举,
没有
RTTI
TypeInfo信息。请参阅。

枚举类型没有基类型,比如TObject是类的基

如果您有一个支持泛型的Delphi版本,那么可以使用下面的帮助程序将序号值转换为枚举值

uses
  System.SysUtils,TypInfo;

Type
  TEnumHelp<TEnum> = record
  type
    ETEnumHelpError = class(Exception);
    class function Cast(const Value: Integer): TEnum; static;
  end;

class function TEnumHelp<TEnum>.Cast(const Value: Integer): TEnum;
var
  typeInf  : PTypeInfo;
  typeData : PTypeData;
begin
  typeInf := PTypeInfo(TypeInfo(TEnum));
  if (typeInf = nil) or (typeInf^.Kind <> tkEnumeration) then
    raise ETEnumHelpError.Create('Not an enumeration type');
  typeData := GetTypeData(typeInf);
  if (Value < typeData^.MinValue) then
    raise ETEnumHelpError.CreateFmt('%d is below min value [%d]',[Value,typeData^.MinValue])
  else
  if (Value > typeData^.MaxValue) then
    raise ETEnumHelpError.CreateFmt('%d is above max value [%d]',[Value,typeData^.MaxValue]);
  case Sizeof(TEnum) of
    1: pByte(@Result)^ := Value;
    2: pWord(@Result)^ := Value;
    4: pCardinal(@Result)^ := Value;
  end;
end;
使用
System.SysUtils,TypInfo;
类型
十帮助=记录
类型
ETEnumHelpError=类(异常);
类函数强制转换(常量值:整数):TEnum;静态;
结束;
类函数TEnumHelp.Cast(常量值:整数):TEnum;
变量
typeInf:PTypeInfo;
typeData:PTypeData;
开始
typeInf:=PTypeInfo(TypeInfo(TEnum));
如果(typeInf=nil)或(typeInf^.Kind tkEnumeration),则
raise ETENUMHELPEROR.Create('不是枚举类型');
typeData:=GetTypeData(typeInf);
如果(ValuetypeData^.MaxValue),则
raise ETENUMHELPEROR.CreateFmt(“%d”高于最大值[%d]”,[value,typeData^.MaxValue]);
案件规模(十)
1:pByte(@Result)^:=值;
2:pWord(@Result)^:=值;
4:pCardinal(@Result)^:=值;
结束;
结束;
例如:

Type
  TestEnum = (aA,bB,cC);

var
  e : TestEnum;
...
e := TEnumHelp<TestEnum>.Cast(2);  // e = cC
类型
睾丸数=(aA、bB、cC);
变量
e:睾丸;
...
e:=TEnumHelp.Cast(2);//e=cC

有一个限制:

不连续或不以零开头的枚举,
没有
RTTI
TypeInfo信息。请参阅。

哪个版本的Delphi?哪个版本的Delphi?你救了我一天…非常感谢…我正在寻找,很难找到像这样的引用,幸运的是我使用了XE2I,我会使Cast方法成为泛型而不是类型。@StefanGlienke,你的意思是
TEnumHelp.Cast(值:Integer)
。这样做的好处是什么?好处是,您可以以非泛型的方式编写Cast方法,并传入
PTypeInfo
,而不必为每个枚举类型生成泛型类型。您节省了我的时间……非常感谢……我一直在寻找这样的引用,很难找到这样的引用,幸运的是,我使用了XE2I,这样的Cast方法d泛型而不是类型。@StefanGlienke,你是说
TEnumHelp.Cast(Value:Integer)
。这样做的好处是什么?好处是你可以以非泛型的方式编写Cast方法,传入
PTypeInfo
,并且不会为每个枚举类型生成泛型类型。