Массив Delphi checklistbox

Я хочу изменить двоичный код, чтобы проверить список. Когда 1 то checklistbox.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;

большое спасибо вам.

1 ответ

Трудно понять, что вы делаете, потому что у нас есть только частичное объяснение и ограниченный код. Тем не менее, это выглядит неправильно:

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 тогда ваш код не будет возражать. Вы должны решить, как обрабатывать эти условия и соответствующим образом кодировать.

Другие вопросы по тегам