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;
ここでは、ブール短絡 (遅延) 評価などのいくつかの「トリック」を利用します。