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; 有何区别?
集合类型

解决方案 »

  1.   

     type
      Tzj = 1 .. 10;
      Tjh = set of Tzj;
    var
      Vjh: Tjh;  //定义Vjh为一个10个元素的集合,你上边定义的
    begin
      Vjh := [15];  //设定Vjh的集合内容为一个元素15
      if 15 in Vjh then   //然后就没有然后了。你试试把这里的15换成其他数字试试
        showmessage('aaaa');
    end;
    然后试试这个
    type
      Tzj = 1 .. 10;
      Tjh = set of Tzj;
    var
      Vjh: Tjh;
    begin
      Vjh := [6,15];
      if 6 in Vjh then   //你把这里的6换成不是6和15的数字
        showmessage('aaaa');
    end;
      

  2.   

    你没明白我的意思,因为你往里面赋了15值,所以if如果换成其它数字那肯定是show不出来的.
    问题的关键是,你为什么能赋上一个15的值? 我在子界里不是明明规定了,取值范围只能是1..10吗?
      

  3.   


    你的概念乱了
    -------------------------------------------------
    //Vjh := [15];//这句是对集合赋值
      Vjh := [];//用这句初始化试试
      if 15 in Vjh then
        showmessage('aaaa');
      

  4.   

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

  5.   

    更正一下,上述代码中 PByte 改成PWord,因为 0..15需要2个字节来保存.