我继承了一些我需要修改的代码。原文基本上就是下面的内容。我需要在枚举列表中添加第九项,但是当我这样做时,我在“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,我不明白异常。
我可以做什么,以便我可以添加第九个枚举并仍然具有代码功能?
答案 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)。