首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2013-08-09 
关于Delphi的集合类型的赋值问题typeTzj 1 .. 10Tjh set of TzjvarVjh: TjhbeginVjh : [15]if 15

关于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后,按照集合来判断就知道权限了,设置,保存都方便.

热点排行