level 8
新手上路552
楼主
12345 //参数的传值方式 // TParamFlag = (pfVar, pfConst, pfArray, pfAddress, pfReference, pfOut, pfResult); TParamFlags = set of TParamFlag;
这是集合定义部分.然后我们看看我们的代码吧.
12345678 procedure TForm3.btn1Click(Sender: TObject);var p: TParamFlags;begin p:=[pfReference]; p:=[pfVar, pfConst, pfArray, pfAddress, pfReference, pfOut, pfResult];end;
如果我们用ord(pfVar)只能得到0,而且delphi的提示里面也是显示的0.但是这里是用[]括起来的.那么值有没有变化呢?

我们看见eax是$10也就是00010000,这就是[pfReference]的值.光pfReference是他是4,但是用到集合后他就变成了二进制的第五位是1也就是16.
也就是在集合中,每一个元素占一位,元素与元素之间用or连接起来组成一个数.
那么一个集合会有多大呢?其实和它有多少个元素有关系,大小应该整除8 + 1吧.看例子:
在上面的例子中加一句
1 ShowMessage(IntToStr(SizeOf(p)));
结果是1,因为TParamFlag 中只有7个元素.
那么我们自己定义一个元素多一点儿的集合来看看吧,
1234567891011 type TTest = (t1,t2,t3,t4,t5,t6,t7,t8,t9); TTests = set of TTest; procedure TForm3.btn4Click(Sender: TObject);var t:TTests;begin ShowMessage(IntToStr(SizeOf(t)));end;
现在结果就是2了.
说了这么多,最后就是在结构体或者其他时候要判断某一位是否为一我们只需要
1 if t1 in t then
如果是true那么第0位就是1了.
2015年08月31日 02点08分
1
这是集合定义部分.然后我们看看我们的代码吧.
12345678 procedure TForm3.btn1Click(Sender: TObject);var p: TParamFlags;begin p:=[pfReference]; p:=[pfVar, pfConst, pfArray, pfAddress, pfReference, pfOut, pfResult];end;
如果我们用ord(pfVar)只能得到0,而且delphi的提示里面也是显示的0.但是这里是用[]括起来的.那么值有没有变化呢?

我们看见eax是$10也就是00010000,这就是[pfReference]的值.光pfReference是他是4,但是用到集合后他就变成了二进制的第五位是1也就是16.也就是在集合中,每一个元素占一位,元素与元素之间用or连接起来组成一个数.
那么一个集合会有多大呢?其实和它有多少个元素有关系,大小应该整除8 + 1吧.看例子:
在上面的例子中加一句
1 ShowMessage(IntToStr(SizeOf(p)));
结果是1,因为TParamFlag 中只有7个元素.
那么我们自己定义一个元素多一点儿的集合来看看吧,
1234567891011 type TTest = (t1,t2,t3,t4,t5,t6,t7,t8,t9); TTests = set of TTest; procedure TForm3.btn4Click(Sender: TObject);var t:TTests;begin ShowMessage(IntToStr(SizeOf(t)));end;
现在结果就是2了.
说了这么多,最后就是在结构体或者其他时候要判断某一位是否为一我们只需要
1 if t1 in t then
如果是true那么第0位就是1了.