将多个TEdits控制为数组

时间:2012-10-14 09:43:52

标签: delphi delphi-7 delphi-2010

我正在尝试对Sudoku解算器进行编程,我想将81 TEdit个控件作为数组控制,但是它们的名称是Edit1Edit2Edit3而不是Edit[1]Edit[2]

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

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:6)

您不需要逐个进行。 您可以使用shft-click或ctrl-drag选择窗体上的多个控件,以便通过矩形选择它们。

总的来说:

  • 使用Object Inspector为一个Edit
  • 设置OnChange处理程序
  • (可选)使用“对象检查器”将其重命名为更通用的名称
  • 选择表单
  • 上的所有其他修改
  • 使用Object Inspector选择刚刚创建的处理程序。 它将分配给您选择的所有修改。

答案 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个变量手动将它们添加到数组中。