发现可以翻译VC里面中位域的方法。
From Copy_Paste: http://www.eping.net/fourm/dispbbs.asp?boardID=15&replyID=3553&ID=720&skin=1
相信大家都在VC里面见过这种结构体吧。
typedef struct
{
union
{
struct
{
BYTE u1:1;
BYTE u2:1;
BYTE u3:1;
BYTE u4:1;
BYTE u5:1;
BYTE u6:1;
BYTE u7:1;
BYTE u8:1;
};
BYTE Flags;
};
} TData;
像这种怎么对应起Delphi的结构了,以前实在没法的时候,只好写两个函数,相互转换,以为D不能对一个字节位操作。
呵,昨天睡觉,突然迷迷糊糊的想到集合这东西好像是可以做成,一试,果然如此。
按上面的写法,应该是这样译:
type
TFlags = set of (u1, u2, u3, u4, u5, u6, u7, u8);
TData = record
case Byte of
0: (Flags: Byte);
1: (u: TFlags);
end;
VC的测试代码:
void Ctest4Dlg::OnBnClickedOk()
{
int s = sizeof(TData);
char buf[10];
itoa(s, buf, 10);
MessageBox(buf);
TData d;
d.u1 = TRUE;
d.u2 = TRUE;
d.u3 = TRUE;
d.u4 = TRUE;
d.u5 = TRUE;
d.u6 = TRUE;
d.u7 = TRUE;
d.u8 = TRUE;
s = (int)d.Flags;
itoa(s, buf, 10);
MessageBox(buf);
}
D的:
procedure TForm1.Button1Click(Sender: TObject);
var
D: TData;
begin
ShowMessage(IntToStr(Sizeof(TData)));
Include(D.u, u1);
Include(D.u, u2);
Include(D.u, u3);
Include(D.u, u4);
Include(D.u, u5);
Include(D.u, u6);
Include(D.u, u7);
Include(D.u, u8);
ShowMessage(IntToStr(D.Flags));
end;