-1

我想将二进制代码更改为复选框。当 1checklistbox.checked = true时 , 0时checklistbox.checked = false。我在清单框中有 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;

非常感谢您。

4

1 回答 1

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;

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

于 2014-11-20T09:12:17.070 回答