添加第九个枚举时无效的类型转换

时间:2017-05-04 12:12:25

标签: delphi ordinal

我继承了一些我需要修改的代码。原文基本上就是下面的内容。我需要在枚举列表中添加第九项,但是当我这样做时,我在“ord(byte(ts))”处获得了无效的类型转换;

program OrdTest;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

type
  TFlag = (tsOne, tsTwo, tsThree, tsFour, tsFive, tsSix, tsSeven, tsEight); // , tsNine
  TStatus = set of TFlag;

function GetStatus(i: integer): TStatus;
var
  ts: TStatus;
  j: smallint;
begin
  try
    ts := GetStatus(4);  // returned from a table

    j := ord(byte(ts)); // Invalid typecast
  except
    on E: Exception do
      Writeln(E.Message)
  end;

end;

end.

因为一个字节可以是任何有效的255,我不明白异常。

我可以做什么,以便我可以添加第九个枚举并仍然具有代码功能?

2 个答案:

答案 0 :(得分:7)

在添加tsNine之前,您有8个枚举值,因此它们中的一组占用了8位并适合Byte。现在你有9位,需要一个Word来适应这个集合。因此你现在必须转换为Word。您可以查看SizeOf(ts)以查看此内容。

答案 1 :(得分:0)

你似乎在混合两件事。

枚举

这些是作为整数值实现的。默认情况下,它们是顺序的。但您也可以为它们设置特定值。例如:

type
  TEnum = (eOne, eTwo, eThree);
  TBigEnum = (beOne = 1, beTen = 10, beHundred = 100, beThousand = 1000);

这里,TEnum确实适合单个字节,最高值为255.TBigEnum需要一个字(因为值为千)。

这些是作为位数组实现的。 "枚举1"是第一位,"枚举2"是第二位,等等,如果你有8个或更少的枚举,它将适合1个字节,9到16,2个字节等。

根据我之前的例子,     TEnum =枚举的集合     TBigEnums = TBigEnum的设置

不会编译,因为值" TBigEnum.eThousand"将是集合中的第1001位(基于零)位,需要一组126字节的大小。 Delphi将集的大小限制为32个字节(最大值= 255)。