我正在尝试对Sudoku解算器进行编程,我想将81 TEdit
个控件作为数组控制,但是它们的名称是Edit1
,Edit2
,Edit3
而不是Edit[1]
,Edit[2]
等
我不想分别为所有81个控件输入OnChange
个事件处理程序。
我该如何解决这个问题?
答案 0 :(得分:6)
您不需要逐个进行。 您可以使用shft-click或ctrl-drag选择窗体上的多个控件,以便通过矩形选择它们。
总的来说:
答案 1 :(得分:5)
您可以动态创建修改。
务必设置编辑框的所有者和父级。
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 :(得分:2)
您可以这样做:
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;
...
您可以使用类似的代码动态创建任何内容。
答案 3 :(得分:2)
除了使用常见的OnChange
事件处理程序和创建编辑运行时之外,您还可以使用设计时控件填充数组。
正如我最近在this answer中所解释的那样,您可以为一维或二维数组添加设计时制作的控件:通过FindComponent
在名称上搜索它们,在Tag
上搜索它们带有循环的属性,或者通过键入81个变量手动将它们添加到数组中。