Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取枚举';在Delphi中使用RTTI或TypeInfo设置有效范围_Delphi_Rtti_Delphi 10.2 Tokyo - Fatal编程技术网

如何获取枚举';在Delphi中使用RTTI或TypeInfo设置有效范围

如何获取枚举';在Delphi中使用RTTI或TypeInfo设置有效范围,delphi,rtti,delphi-10.2-tokyo,Delphi,Rtti,Delphi 10.2 Tokyo,我在一个测试项目中使用RTTI来计算枚举值,这是对象上最常见的属性。如果枚举超出范围,我希望显示类似于评估/修改IDE窗口所显示的文本。比如“(越界)255” 下面的示例代码使用TypeInfo在使用GetEnumName时,将枚举之外的值的问题显示为访问冲突。任何使用RTTI或TypeInfo的解决方案都会对我有所帮助,我只是不知道测试代码中的枚举类型 program Project60; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUt

我在一个测试项目中使用RTTI来计算枚举值,这是对象上最常见的属性。如果枚举超出范围,我希望显示类似于评估/修改IDE窗口所显示的文本。比如“(越界)255”

下面的示例代码使用TypeInfo在使用
GetEnumName
时,将枚举之外的值的问题显示为访问冲突。任何使用RTTI或TypeInfo的解决方案都会对我有所帮助,我只是不知道测试代码中的枚举类型

program Project60;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,  TypInfo;

Type
  TestEnum = (TestEnumA, TestEnumB, TestEnumC);

const
  TestEnumUndefined = TestEnum(-1);

  procedure WriteEnum(const ATypeInfo: PTypeInfo; const AOrdinal: Integer);
  begin
    WriteLn(Format('Ordinal: %d = "%s"', [AOrdinal, GetEnumName(ATypeInfo, AOrdinal)]));
  end;


var
  TestEnumTypeInfo: PTypeInfo;
begin

  try
    TestEnumTypeInfo := TypeInfo(TestEnum);

    WriteEnum(TestEnumTypeInfo, Ord(TestEnumA));
    WriteEnum(TestEnumTypeInfo, Ord(TestEnumB));
    WriteEnum(TestEnumTypeInfo, Ord(TestEnumC));
    WriteEnum(TestEnumTypeInfo,  Ord(TestEnumUndefined));   //AV

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.
用于从中获取更详细的信息,例如:

procedure WriteEnum(const-ATypeInfo:PTypeInfo;const-AOrdinal:Integer);
变量
LTypeData:PTypeData;
开始
LTypeData:=GetTypeData(ATypeInfo);

if(AOrdinal>=LTypeData.MinValue)和(AOrdinal谢谢你。你的例子还让我找到了
TRttiOrdinalType
(其decent
trttineumerationtype
)具有
MinValue
MaxValue
procedure WriteEnum(const ATypeInfo: PTypeInfo; const AOrdinal: Integer);
var
  LTypeData: PTypeData;
begin
  LTypeData := GetTypeData(ATypeInfo);
  if (AOrdinal >= LTypeData.MinValue) and (AOrdinal <= LTypeData.MaxValue) then
    WriteLn(Format('Ordinal: %d = "%s"', [AOrdinal, GetEnumName(ATypeInfo, AOrdinal)]))
  else
    WriteLn(Format('Ordinal: %d (out of bound)', [AOrdinal]));
end;