刚才看别人的帖子,突然有了下面的问题:
定义一个集合类型
MM=SET 1..10;
var
 ss:MM;
begin
 ss:=[2,3];
这里定义了ss变量,假如这里ss已经赋值,但是又看不到(假如,封装在另外单元),看不到的含义这里是,不知道这个变量的里的个数,内容,现在怎么把这个变量里的值显示出来?

解决方案 »

  1.   

    具体个什么循环法?请 CloneCenter(复制中心 )说说,谢谢
      

  2.   

    没有任何好方法!我刚给你在System单元中看了,根本没有集合过程Include和Exclude的方法定义,但帮助中说是在System单元中!想访问集合内容,只能用指针了....偶看看....
      

  3.   

    没有任何好方法!我刚给你在System单元中看了,根本没有集合过程Include和Exclude的方法定义,但帮助中说是在System单元中!想访问集合内容,只能用指针了....偶看看....
      

  4.   

    uses TypInfotype
      TTest = (a, b, c, d, e ,f);
    .
    .
    .
    procedure TForm1.Button1Click(Sender: TObject);
    var
      tinfo: PTypeInfo;
      tdata: PTypeData;
      i: Integer;
    begin
      tinfo := TypeInfo(TTest);
      tdata := GetTypeData(tinfo);
      for i := tdata^.MinValue to tdata^.MaxValue do
        ListBox1.Items.Add(GetEnumName(tinfo, i));
    end;
      

  5.   

    楼上使用RTTI的方法很好,但如果你进TypeData记录看看就可以知道,Delphi只给集合类型提供一个信息保存,如下:
    ....
    tkSet: (
      CompType: PPTypeInfo));
    ....
    所以,你的思路很好(偶是没有想到,HOHO!),8过这种思路没有办法得到这个楼主想要的东西!你上面使用的是枚举类型,而枚举类型的RTTI信息要比集合多!
      

  6.   

    To DickeyBird888  另外,我想了一下,其实使用RTTI来解决这种问题几乎没有任何可能!RTTI是存放类型本身的信息,而这里是要出具体类型的量的内容,而且对于集合这种类型,就算RTTI中包含了类似枚举那种MaxValue和MinValue的信息,这个信息也不可能对任何基类型固定的集合类型起任何作用!好比这样:
    type
      TSomeSet=Set of 1..255;  //这里定义了一个基本类型
    ....
    var
      SA,SB:TSomeSet;  //这里定义两个以TSomeSet为基本类型的集合变量SA和SB,对于这两个变量,虽然都可以共享上面假设存在的MaxValue和MinValue这些信息,但这些信息对于SA和SB这两个量没有什么实际意义,尤其对付楼主这种问题!更何况这些信息是根本就没有的!
      

  7.   

    uses TypInfotype
      TTest = (a, b, c, d, e ,f);
    .
    .
    .
    procedure TForm1.Button1Click(Sender: TObject);
    var
      TTests=set of TTest;
      tinfo: PTypeInfo;
      tdata: PTypeData;
      i: Integer;
    begin
      tinfo := TypeInfo(TTest);
      tdata := GetTypeData(tinfo);
      for i := tdata^.MinValue to tdata^.MaxValue do
        ListBox1.Items.Add(GetEnumName(tinfo, i));
    end;
      

  8.   

    To DickeyBird888  首先我申明一点,RTTI的确很有用处,至少可以让我写代码的时候指头少动一点,呵呵.....  你这里申明的集合元素的基本类型是一个枚举类型(枚举类型是非结构类型,Delphi中的结构类型只有如下几种:文件,集合,数组,记录,类,类引用,接口等),同时集合是唯一一种元素内容不能为结构类型的结构类型(呵呵,这个话好饶口!),所以这种定义是正确的(先定义一个枚举类型,在以此为基类型定义集合类型)!这样,集合的元素是枚举值,也就是可以看作一个小集合类型,而元素的值永远都是(a, b, c, d, e ,f)!  这样,你这里的代码我顺便也解释一下:procedure TForm1.Button1Click(Sender: TObject);
    var
      TTests:set of TTest;
      tinfo: PTypeInfo;
      tdata: PTypeData;
      i: Integer;
    begin
      tinfo := TypeInfo(TTest);  //返回一个RTTI指针,这个指针的内容指向TTest,而不是TTests,这点一定要看清楚,所以从这里开始你实际上还是在取枚举的RTTI信息,根本没有对集合的内容进行任何操作!
      tdata := GetTypeData(tinfo);  //根据RTTI指针,重新定位到TypeData结构,开始获取类型信息
      for i := tdata^.MinValue to tdata^.MaxValue do
        ListBox1.Items.Add(GetEnumName(tinfo, i));  //这里只是简单的把你定义的枚举类型的值进行罗列,而楼主要的是一个集合变量里面的数量不确定的元素内容!
    end;----------------------------------------------------------------------还是认为RTTI解决不了这种问题!
      

  9.   

    呵呵,这个问题有点Crack色彩
    既然有Crack色彩,为什么不Crack一下?
    用Hview就能查看到。
    通过编程方法,我还没有办法,呵呵。
      

  10.   

    这个楼主的意思就是是否可以显示一个集合里面的内容,比如这样
    var
      S:Set of 1..5;
    begin
      S:=[2,4];
      //如何显示这个集合S里面的内容?另外这里有个问题,请教伴水,假设上面这个赋值没有的情况下直接使用语句if 4 in S then ShowMessage('E');也将显示对话框,为什么?
    end;
      

  11.   

    循环测试: for i:=1 to 10 do
     begin
       if i in ss then memo1.Lines.add(inttostr(i));
     end;
      

  12.   

    //那就直接访问内存吧~~
    procedure TForm1.Button1Click(Sender: TObject);
    var
      S: set of 1..16;
      T: TIntegerSet;
      I: Integer;
      Str: string;
    begin
      S := [1, 3, 5, 7];  FillChar(T, SizeOf(T), 0);
      Move(S, T, SizeOf(S));  Str := '';
      for I := 0 to SizeOf(Integer) * 8 - 1 do
        if I in T then
          Str := Str + ',' + IntToStr(I); (* TypInfo.GetEnumName(TypeInfo, I) *)
      Delete(Str, 1, 1);
      ShowMessage(Str);
    end;//如何显示这个集合S里面的内容?另外这里有个问题,请教伴水,假设上面这个赋值没有的情况下直接使用语句if 4 in S then ShowMessage('E');也将显示对话框,为什么?
    ---------------
    晕,局部变量声明又没有初始化,值是不确定的~~
      

  13.   

    局部变量申明不初始化,局部简单类型变量申明是要初始化的!这里是个结构类型,没有初值,既然没有初值,那if 4 in S then....怎么会判断通过?
      

  14.   

    to FrameSniper:看看以前我灌过的一段~~面向“面向对象”一切都是数据
    这个命题属于哲学范畴
    这只是一种世界观
    如果你不能彻底的证明这是一个错误的命题
    那么请你不要对此发表任何反对意见
    强调的是:
    如果你能证明一切都是物质
    我也可以证明一切都是数据
    另外随便证明一切都是灵魂延伸命题及相关命题如下:
    只因为一切都是“0”和“1”
    所以处理数据的方法也是数据函数:对数据处理的描述
    类型(普通类型):对数据存储方式的描述 //一种特殊的类--没有关系的类
    指针:数据在内存中存储的位置
    值:数据具体存储的内容
    变量:对实际存储概括(所有的变量都可以看成指针变量)
    类:对数据存储方式及关系的描述(关系包括:元素关系、存取关系及父子关系)
    属性:类中对该元素数据存取关系的描述
    字段:类中声明的变量
    方法:类中声明的函数
    事件:类型为方法的属性
    对象:类的实例
    对于“元素关系”、“存取关系”及“父子关系”
    我就不多说
    请你在实际编程中慢慢独自品味
    过程是特殊的函数
    返回值为空的函数
    很多编程语言都没有过程这个概念
    这个概念对了解C的人不值一提
    因为C中只有函数
    注意:运算符号、语法结构可以看成更特殊的函数(但愿你了解汇编)类型是特殊的类
    没有关系描述的类
    这个概念对了解JAVA的人不值一提
    因为JAVA中只有类不难想象:
    把函数看成数据,就当出现“DLL”
    把关系看成数据,就当出现“OOP”
    把元件看成数据,就当出现“COM”
    把类型看成数据,就当出现“XML”//不要为如下比喻感到陌生
    类就想一个模具(比如:做饼的模具)
    只要有足够的资料(比如:面团)
    就可以生产出一个个相同的物品出来(比如:月饼)//不要为以下语句感到吃惊
    { 类也是数据 }
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Caption := Format('Self:%p, TForm1:%p', [Pointer(Self), Pointer(TForm1)]);
    end;{ 示例对变量的内存地址直接操作 }
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      P: Pointer;
    begin
      I := 0;
      P := Addr(I);
      PInteger(P)^ := 123;
      Caption := IntToStr(I);
    end;{ 类型也是数据 }
    uses TypInfo;procedure TForm1.FormCreate(Sender: TObject);
    var
      vTypeInfo: PTypeInfo;
    begin
      vTypeInfo := TypeInfo(Integer);
      Caption := vTypeInfo.Name;
    end;
      

  15.   

    哈哈哈哈哈哈哈哈,FrameSniper 3$