我想将二进制代码更改为checklistbox。当1为checklistbox.checked = true
时,0为checklistbox.checked = false
。我在checklistbox中有5个项目。当Tedit填充11111和00000时,它可以完美地工作。但是,当我把11011,第四项取消选中,而不是第三项。
这是我的代码,
procedure TForm1.BUT_2Click(Sender: TObject);
var
i,j, k: Integer;
kode: array[0..6] of string;
// checkbox: array[1..5] of TCheckListBox;
begin
i:=0;
j:= 1;
kode[i]:= '0';
CheckListBOX2.Checked[i]:= True;
for i:=0 to Length(EDI_2.Text)-1 do
begin
kode[i]:= Copy(EDI_2.Text, i, j);
if kode[i]= '1' then
begin
CheckListBOX2.Checked[i]:= True;
end
else
begin
kode[i]:= Copy(EDI_2.Text, i, j);
CheckListBOX2.Checked[i]:= False;
end;
end;
end;
非常感谢你。
答案 0 :(得分:0)
要弄清楚你在做什么有点困难,因为我们只有部分解释和有限的代码。但是,这看起来不对:
Copy(EDI_2.Text, i, j);
假设您有基于1的字符串(即未使用移动编译器),则循环变量i
从0
开始。你应该使用:
Copy(EDI_2.Text, i+1, j);
现在,您不需要j
,因为它总是1
。所以它变成了:
Copy(EDI_2.Text, i+1, 1);
此时您可以删除Copy
并使用直接字符索引:
EDI_2.Text[i+1]
另请注意,将相同的值分配给kode[i]
两次是没有意义的。所以循环可能变成:
for i := 0 to Length(EDI_2.Text)-1 do
begin
kode[i] := EDI_2.Text[i+1];
CheckListBOX2.Checked[i] := (kode[i] = '1');
end;
现在我们可以看到不需要数组kode
。所以我们可以写:
for i := 0 to Length(EDI_2.Text)-1 do
begin
CheckListBOX2.Checked[i] := (EDI_2.Text[i+1] = '1');
end;
然后我们可以看到循环之前的所有代码都是毫无意义的。所以整个功能将成为:
procedure TForm1.BUT_2Click(Sender: TObject);
var
i: Integer;
Text: string;
begin
Text := EDI_2.Text;
for i := 0 to Length(Text)-1 do
begin
CheckListBOX2.Checked[i] := (Text[i+1] = '1');
end;
end;
关于用户输入数据清理的最后一点。如果用户可以自由地在编辑框中放置他们喜欢的内容,那么他们可能会提供太短或太长的字符串。在任何一种情况下,上面的代码都不会处理这种情况。同样,如果他们输入的数字不是0
或1
,那么您的代码就不会反对。您需要决定如何处理这些条件和相应的代码。