2

我正在尝试编写数独求解器,并且我想将 81 个TEdit控件控制为数组,但它们的名称是Edit1, Edit2,Edit3而不是Edit[1],Edit[2]等。

我不想OnChange分别为所有 81 个控件键入事件处理程序。

我该如何解决这个问题?

4

4 回答 4

6

你不需要一一做。您可以使用 shft-click 或 ctrl-drag 选择表单上的多个控件,以通过矩形选择它们。

所以总的来说:

  • 使用对象检查器为一个编辑设置 OnChange 处理程序
  • 可以选择使用对象检查器将其重命名为更通用的名称
  • 选择表单上的所有其他编辑
  • 使用 Object Inspector 选择您刚刚创建的处理程序。它将分配给您选择的所有编辑。
于 2012-10-14T09:52:53.760 回答
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 是表单的二维数组字段。

于 2012-10-14T09:51:13.777 回答
2

除了使用公共OnChange事件处理程序和创建编辑运行时之外,您还可以使用设计时制作的控件填充数组。

正如我最近在这个答案中解释的那样,您可以将设计时制作的控件添加到一维或二维数组中:通过在名称上FindComponent搜索它们,使用循环在Tag属性上搜索它们,或者通过键入它们手动将它们添加到数组中81 个变量。

于 2012-10-14T23:30:25.587 回答
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;
...

您可以使用类似的代码动态创建您想要的任何内容。

于 2012-10-14T09:51:59.983 回答