TEdit
数独ソルバーをプログラムしようとしていて、81個のコントロールを配列として制御したいのですが、それらの名前はEdit1
、Edit2
ではEdit3
なくEdit[1]
、Edit[2]
です。
OnChange
81 個のコントロールすべてのイベント ハンドラーを個別に入力したくありません。
どうすればこれを解決できますか?
TEdit
数独ソルバーをプログラムしようとしていて、81個のコントロールを配列として制御したいのですが、それらの名前はEdit1
、Edit2
ではEdit3
なくEdit[1]
、Edit[2]
です。
OnChange
81 個のコントロールすべてのイベント ハンドラーを個別に入力したくありません。
どうすればこれを解決できますか?
一つ一つやる必要はありません。Shift キーを押しながらクリックするか、Ctrl キーを押しながらドラッグして四角形で選択すると、フォーム上の複数のコントロールを選択できます。
したがって、一般的に:
編集を動的に作成できます。
編集ボックスの所有者と親を必ず設定してください。
procedure TForm1.OnCreate(Sender: TObject);
var
x, y : Integer;
begin
for y := 1 to 9 do begin
for x := 1 to 9 do begin
FEdit[x,y] := TEdit.Create(self);
FEdit[x,y].Parent := self;
FEdit[x,y].Left := // function based on x
FEdit[x,y].Top := // function based on y
FEdit[x,y].Name := // function based on x and y
FEdit[x,y].Width // any value you like
FEdit[x,y].Height // any value you like
FEdit[x,y].Tag = 10*y + x;
FEdit[x,y].OnChange = OnHandleChange;
end;
end;
end;
procedure TForm1.OnHandleChange(Sender: TObject);
var
x,y : Integer;
begin
if not Sender is TEdit then Exit;
y := TEdit(Sender).Tag div 10;
x := TEdit(Sender).Tag mod 10;
// Add check if x and y are valid
// You now know that FEdit[x,y] is changed and you can handle accordingly.
end;
FEdit は、フォームの 2 次元配列フィールドです。
共通のOnChange
イベント ハンドラーの使用と編集ランタイムの作成に加えて、設計時に作成されたコントロールで配列を埋めることもできます。
この回答で最近説明したように、設計時に作成されたコントロールを 1 次元または 2 次元の配列に追加できます。名前でFindComponent
検索するTag
か、ループでプロパティで検索するか、または入力して手動で配列に追加します。 81 変数。
次のようなことができます。
var
myedit: array[1..81] of TEdit;
i: integer;
...
begin
...
for i := 1 to 81 do begin
myedit[i] := TEdit.Create(form1);
with myedit[i] do begin
width := 50;
top := 50 + (i * 55);
left := 50;
text := 'mytext '+inttostr(i);
parent := form1;
// more properties...
end;
end;
...
同様のコードを使用して、必要なものを動的に作成できます。