Hei*_*cht 7 delphi casting set delphi-2009
set
Delphi中的内存是如何组织的?
我尝试做的是将简单类型转换为类似的集合类型
var
MyNumber : Word;
ShiftState : TShiftState;
begin
MyNumber:=42;
ShiftState:=TShiftState(MyNumber);
end;
Run Code Online (Sandbox Code Playgroud)
德尔福(2009)不允许这样做,我不明白为什么.如果我得到一个数字,其中单个位编码不同的枚举值,那么这将使我的生活变得更容易,我可以像这样投射它.可以这样做吗?
我打算采用的一种方法是:
var
ShiftState : TShiftState;
MyNumber : Word absolute ShiftState;
begin
MyNumber:=42;
end;
Run Code Online (Sandbox Code Playgroud)
但在此之前,我想我会要求内存布局.这是一种感觉,而不是知道我现在对此有何看法.
Delphi集是一个位字段,其位对应于集合中元素的关联值.对于一组常规枚举类型,位布局是直截了当的:
当你处理一个非连续的集合或者一个不从0开始的集合时,事情会变得有趣.你可以使用Delphi的子范式(例如:) set of 3..7
或使用指定实际序数值的枚举类型来做到这一点.对于元素:
type enum=(seven=7, eight=8, eleven=11);
EnumSet = set of enum;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Delphi将分配包含所有必需位的最小所需字节数,但不会"移位"位值以使用更少的空间.在EnumSet
示例中,Delphi将使用两个字节:
seven
eight
eleven
你可以看到我在这里做过的一些测试:Delphi 2009 - Bug?将所谓的无效值添加到集合中
测试是使用Delphi 2010完成的,没有重复使用Delphi XE.