我正在尝试编写数独求解器,并且我想将 81 个TEdit
控件控制为数组,但它们的名称是Edit1
, Edit2
,Edit3
而不是Edit[1]
,Edit[2]
等。
我不想OnChange
分别为所有 81 个控件键入事件处理程序。
我该如何解决这个问题?
我正在尝试编写数独求解器,并且我想将 81 个TEdit
控件控制为数组,但它们的名称是Edit1
, Edit2
,Edit3
而不是Edit[1]
,Edit[2]
等。
我不想OnChange
分别为所有 81 个控件键入事件处理程序。
我该如何解决这个问题?
你不需要一一做。您可以使用 shft-click 或 ctrl-drag 选择表单上的多个控件,以通过矩形选择它们。
所以总的来说:
您可以动态创建编辑。
请务必设置编辑框的所有者和父级。
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 是表单的二维数组字段。
除了使用公共OnChange
事件处理程序和创建编辑运行时之外,您还可以使用设计时制作的控件填充数组。
正如我最近在这个答案中解释的那样,您可以将设计时制作的控件添加到一维或二维数组中:通过在名称上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;
...
您可以使用类似的代码动态创建您想要的任何内容。