• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi-位域的解决办法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

记得以前在将C++的头文件时候在结构体中有个成员是位域定义,说白了就是将一个字节中的每一位代表什么意思,比如第3位如果为1的话代表代表数据有效,反之为0就是数据无效.
当时没有办法就直接定义一个字节吧,在使用的时候先读出这个字节然后用与运算来判断吧.

最近困在襄樊和河南的一个交界处,偏僻呀,不过也好,没事干的时候可以看看代码吧.
其实在很早之前看JEDI中翻译的Pas文件时候就看到过用Set来表示位域的,当时没有怎么在意,今天在看ObjAuto单元的时候,测试的时候有点儿新的发现:

//参数的传值方式
  //
  TParamFlag = (pfVar, pfConst, pfArray, pfAddress, pfReference, pfOut,
    pfResult);
  TParamFlags = set of TParamFlag;

这是集合定义部分.然后我们看看我们的代码吧.

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吧.看例子:
在上面的例子中加一句

ShowMessage(IntToStr(SizeOf(p)));

结果是1,因为TParamFlag 中只有7个元素.
那么我们自己定义一个元素多一点儿的集合来看看吧,

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了.

说了这么多,最后就是在结构体或者其他时候要判断某一位是否为一我们只需要

if t1 in t then

如果是true那么第0位就是1了.

好了要说的就是这么多了.


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
MATLAB中plot函数的用法发布时间:2022-07-18
下一篇:
DELPHI程序的自动升级功能的实现(AUTOUPDATE使用指南)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap