相关疑难解决方法(0)

如何在Delphi中使用RTTI或TypeInfo获取枚举的有效范围

我在测试项目中使用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.
Run Code Online (Sandbox Code Playgroud)

delphi rtti delphi-10.2-tokyo

4
推荐指数
1
解决办法
210
查看次数

如何检查整数是否可以转换为枚举类型值?

我已经InRange在我的枚举器类型上定义了一个函数。True如果传递的整数参数可以转换为枚举器类型,则该函数应该返回。

  TMyEnum = (eA, eB);
  TMyEnumHelper = record helper for TMyEnum
    class function InRange(AValue : integer) : Boolean; static;
  end;

...

class function TMyEnumHelper.InRange(AValue : integer) : Boolean;
begin
  Result :=
    (AValue >= Low(TMyEnum)) and
    (AValue <= High(TMyEnum));
end;
Run Code Online (Sandbox Code Playgroud)

在编译时,在该行(AValue >= Low(TMyEnum)),我收到以下错误:

[dcc32 错误] Unit1.pas(34): E2008 不兼容的类型

我做了一些测试,但我真的不明白出了什么问题......即:

  1. 我已尝试将函数的AValue参数类型切换InRangeByte, ShortInt, Word, SmallInt, LongWord, Cardinal, LongInt, Integerand Int64,但在编译时会引发相同的错误。
  2. 如果我将枚举数定义为TMyEnum = …

delphi enums delphi-xe7

2
推荐指数
1
解决办法
213
查看次数

标签 统计

delphi ×2

delphi-10.2-tokyo ×1

delphi-xe7 ×1

enums ×1

rtti ×1