首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

一个小疑点,

2012-02-14 
一个小问题,急,急,急我的Form上有100个CheckBox,通过串口将这100个CheckBox的ItemIndex发送出去,我原来做

一个小问题,急,急,急
我的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;

热点排行