2

私は10個のテキストボックス(5ペア)がある学校のプロジェクトに取り組んでいます。

アイデアは、各ペアの合計が最大で「3」になることができるということです。それで

[1] [2]

[1] [0]

..。

[2] [1]

「onChange」イベント中にこれをチェックするのは時間がかかりすぎると思ったので、すべてをチェックするボタンを使用してチェックすることにしました。いずれかのペアが要件を満たさなくなるとすぐにshowmessage()をスローします。

ここで、各ペアを調べて、それらの値が3以下であり、負ではないかどうかを確認する方法はありますか?大量のコードを記述して手動で実行できることはわかっていますが、可能な限りクリーンに保ちたいと思います。

ありがとう!

4

1 に答える 1

5

TEditフォームに 10 個のコントロールをドロップします。これらは手動で作成したため、コードで簡単にアクセスできるようにする必要がありますが、これを行うための非常にエレガントな方法はありません。しかし、これは機能します:

実装セクションで、定義します

type
  TEditorPair = record
    First,
    Second: TEdit;
  end;

FEditors: array[0..4] of TEditorPair;フォーム クラスにプライベート フィールドを追加します。そして、やります

procedure TForm1.FormCreate(Sender: TObject);
begin
  FEditors[0].First := Edit1;
  FEditors[0].Second := Edit2;
  FEditors[1].First := Edit3;
  FEditors[1].Second := Edit4;
  FEditors[2].First := Edit5;
  FEditors[2].Second := Edit6;
  FEditors[3].First := Edit7;
  FEditors[3].Second := Edit8;
  FEditors[4].First := Edit9;
  FEditors[4].Second := Edit10;
end;

ここで、10 個のエディター コントロールをすべて選択し、共通のOnChangeイベントを追加します。

procedure TForm1.EditorChange(Sender: TObject);

  procedure FailPair(PairIndex: integer);
  begin
    FEditors[PairIndex].First.Color := clRed;
    FEditors[PairIndex].Second.Color := clRed;
  end;

  procedure PassPair(PairIndex: integer);
  begin
    FEditors[PairIndex].First.Color := clWindow;
    FEditors[PairIndex].Second.Color := clWindow;
  end;

var
  i: Integer;
  n1, n2: integer;
begin
  for i := 0 to high(FEditors) do
  begin
    if (FEditors[i].First.Text = '') or (FEditors[i].Second.Text = '') then
      Continue;
    if TryStrToInt(FEditors[i].First.Text, n1) and TryStrToInt(FEditors[i].Second.Text, n2) then
      if InRange(n1+n2, 0, 3) then
        PassPair(i)
      else
        FailPair(i)
    else
      FailPair(i);
  end;
end;

コンパイルされた EXE のサンプル

コードゴルフに参加している場合、EditorChange手順は次のように短縮できます。

procedure TForm1.EditorChange(Sender: TObject);

  procedure PairFeedback(PairIndex: integer; Pass: boolean);
  const
    Colors: array[boolean] of TColor = (clRed, clWindow);
  begin
    FEditors[PairIndex].First.Color := Colors[Pass];
    FEditors[PairIndex].Second.Color := Colors[Pass];
  end;

var
  i: Integer;
  n1, n2: integer;
begin
  for i := 0 to high(FEditors) do
  begin
    if (FEditors[i].First.Text = '') or (FEditors[i].Second.Text = '') then
      Continue;
    PairFeedback(i, TryStrToInt(FEditors[i].First.Text, n1) and
      TryStrToInt(FEditors[i].Second.Text, n2) and InRange(n1+n2, 0, 3));
  end;
end;

ここでは、ブール短絡 (遅延) 評価などのいくつかの「トリック」を利用します。

于 2012-12-11T13:04:32.047 に答える