Delphi checklistbox数组

时间:2014-11-20 09:04:09

标签: delphi tchecklistbox

我想将二进制代码更改为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;
非常感谢你。

1 个答案:

答案 0 :(得分:0)

要弄清楚你在做什么有点困难,因为我们只有部分解释和有限的代码。但是,这看起来不对:

Copy(EDI_2.Text, i, j);

假设您有基于1的字符串(即未使用移动编译器),则循环变量i0开始。你应该使用:

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;

关于用户输入数据清理的最后一点。如果用户可以自由地在编辑框中放置他们喜欢的内容,那么他​​们可能会提供太短或太长的字符串。在任何一种情况下,上面的代码都不会处理这种情况。同样,如果他们输入的数字不是01,那么您的代码就不会反对。您需要决定如何处理这些条件和相应的代码。