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