-1

バイナリコードをチェックリストボックスに変更したい。1 の場合checklistbox.checked = trueは 、0 の場合はchecklistbox.checked = false. チェックリストボックスに5つの項目があります。Tedit で 11111 と 00000 を入力すると、完全に機能します。しかし、11011 を入れると、3 番目の項目ではなく 4 番目の項目のチェックが外れます。

ここに私のコードがあります、

    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 から始まる文字列がある (つまり、モバイル コンパイラを使用していない) と仮定すると、ループ変数iは から始まり0ます。代わりに次を使用する必要があります。

Copy(EDI_2.Text, i+1, j);

j今は、常になので必要ありません1。したがって、次のようになります。

Copy(EDI_2.Text, i+1, 1);

この時点で、Copyストレート文字インデックスを削除して使用できます。

EDI_2.Text[i+1]

同じ値を 2 回代入しても意味がないことにも注意してください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、コードは拒否されません。これらの条件を処理する方法を決定し、それに応じてコーディングする必要があります。

于 2014-11-20T09:12:17.070 に答える