读书人

一个小疑点

发布时间: 2012-02-14 19:19:19 作者: rapoo

一个小问题,急,急,急
我的Form上有100个CheckBox,通过串口将这100个CheckBox的ItemIndex发送出去,我原来做的程序是这
100个ItemIndex占100个字节,但现在要改,100个ItemIndex占20个字节,具体的协议是:
0 1 0 × × × × ×
例如:如果前五个CheckBox都选中的话,那第一个字节中的8位就是:0 1 0 1 1 1 1 1
每个字节的前三位固定是 0 1 0 ,后五位表示五个连续的CheckBox的选中情况。
我现在要问的是:怎样将这100个字节的数据通过协议转化为20个字节。
顺便说一下,程序已经作好了,这20个字节的数据是临时加上的。前面的数据发送的时候,
我已经将所有的数据定义到一个byte类型的数组里面。而且能实现预定的功能。
所以,主要问题就是把这100个ItemIndex转化为20个字节的byte类型的数据,
例如:如果第一个字节是01011111,那我就可以这样定义:byte[i] :=95,以此类推,总共20个字节。
快过年了,时间比较紧,还望各位大侠指点。谢谢!预祝各位新年快乐!

[解决办法]
var
A1 : array[0..99] of Byte;//如果这两个数组的下标不是从0开始的,要推算并修改下面的I,J用法
A2 : array[0..19] of Byte;
I,J: integer;
begin
fillChar(A1,100,1);//这句仅是我调试用的:把100个元素全部置为1,即“选中”
for I := low(A2) to High(A2) do
begin
A2[I] := 64;
for J := I*5 to I*5+4 do
A2[I] := A2[I] + (A1[J] shl (J-I*5));
end;
{ 至此,A2数组元素全部为95 }
end;
[解决办法]
//参考如下代码
var
vBytes: array[0..20 - 1] of Byte;
vCheckBox: TCheckBox;
I: Integer;
begin
FillChar(vBytes, SizeOf(vBytes), 0);
for I := 0 to 100 - 1 do
begin
TComponent(vCheckBox) := FindComponent(Format( 'CheckBox%d ', [I + 1]));
vBytes[I div 8] := vBytes[I div 8] or
(Ord(Assigned(vCheckBox) and vCheckBox.Checked) shl (7 - I mod 8));
end;
end;

读书人网 >.NET

热点推荐