读书人

关于Delphi的集合类型的赋值有关问题

发布时间: 2013-08-09 15:16:24 作者: rapoo

关于Delphi的集合类型的赋值问题


type
Tzj = 1 .. 10;
Tjh = set of Tzj;
var
Vjh: Tjh;
begin
Vjh := [15];
if 15 in Vjh then
showmessage('aaaa');
end;

以上代码竟然Show出了'aaaa',请问这是为什么呢? 我在定义集合的时候不是已经声明了,取值范围只能是1..10吗? 为什么他可以赋上一个15的值?
如果我把 Tzj = 1 .. 10; 这行改成 Tzj = 20 .. 30; 有何区别?
集合类型
[解决办法]
如果等于16就赋不上值,估计是二进制问题吧,15的二进制是1111,有四位,你集合最大数10的二进制1010,都是4位,估计系统是按位数判断的~16的二进制是10000有5位,所以赋不上~具体解释还要等高人,学习下!
[解决办法]
1.集合是按照字节存储的而不是按照位存储的.因此定义成0..10 和定义成0..15没区别
2.集合只表示元素是否存在,以元素在枚举中的位置为依据进行操作.如果超界,就放弃超界的部分.
比如type 0..15时,如果 x := [16],你是在对17位进行操作,显然超界,只取低位,低位全部是0,因此赋予后集合为空.
如果是 X := [0,16];,这就是对第0,16位设置为1,其他位置为0,由于16位超界,因此放弃高位,最后得到的只有[0],如果没有超界,那16位就会有效
3.举个例子来帮助大家理解集合

type
TTestEnum = 0 .. 15;
TTestEnums = set of TTestEnum;
var
Enums : TTestEnums;

procedure TForm1.FormCreate(Sender: TObject);
begin
Enums := [];
PByte(@Enums)^ := 128; //128的2进制=10000000
//由于10000000中,第8位为1,其他都是0,因此该集合只包括一个元素,那就是位于TTestEnum中的第8个位置的元素,
//因此 此时 Enums = [7];
PByte(@Enums)^ := 129; //129的2进制=10000001
//由于10000001中,第1位和第8位为1,其他都是0,因此该集合只包括2个元素,那就是位于TTestEnum中的第1个和8个位置的元素,
//因此 此时 Enums = [0,7];
//其他类推,也可以反推得到2进制数
end;

1楼的理解稍有偏差.

用集合来保存权限,数据库中一个BigInt字段就可以保存63个权限,取出Int64后,按照集合来判断就知道权限了,设置,保存都方便.

读书人网 >.NET

热点推荐