我正在寻找一种方法来改变我正在写信息的面板。 Panelsname由模式构建

时间:2016-02-22 20:51:17

标签: delphi variables

我可能有一个非常简单的修复问题,虽然我不知道如何做到这一点。我对Delphi很陌生,这就是为什么我的经验很少。 下面是我想要简化的代码:

procedure TForm1.Asign();
    begin
      case TileValue[1,1] of
        0: Fx1y1.Color:=clBtnFace;
        1: Fx1y1.Color:=clBlue;
        2: Fx1y1.Color:=clMaroon;
      end;
      case TileValue[1,2] of
        0: Fx1y2.Color:=clBtnFace;
        1: Fx1y2.Color:=clBlue;
        2: Fx1y2.Color:=clMaroon;
      end;
      case TileValue[1,3] of
        0: Fx1y3.Color:=clBtnFace;
        1: Fx1y3.Color:=clBlue;
        2: Fx1y3.Color:=clMaroon;
      end;
    end;

Fx1y1是一个面板,而x1是坐标以及y1(一个游戏" 4中的坐标")。我试图以某种方式用另一个变量替换面板名称中的x和y坐标,这样我就可以缩短代码。看起来应该是这样的:

procedure TForm1.Asign();
  var A,B:integer;
    begin
      for B:=1 to 6 do begin
      for A:=1 to 7(Because the 4 in a row playing field is 6 by 7) do begin
        case TileValue[A,B] of
          0: Fx{A}y{b}.Color:=clBtnFace;
          1: Fx{A}y{b}.Color:=clBlue;
          2: Fx{A}y{b}.Color:=clMaroon;
        end;
      end;
      end;
    end;

这甚至可能吗?如果是或否,请告诉我。

1 个答案:

答案 0 :(得分:2)

您可以使用表单FindComponent函数执行您要求的操作,该函数返回所提供名称的组件。由于它可以是任何组件,因此您必须将结果强制转换为TPanel。如果没有提供名称的组件,则会抛出异常;如果不是Panel,则抛出异常。为了进一步简化代码,我还将使用数组作为颜色。

procedure TForm1.Assign;
  const Colors: array[0..2] of TColor = (clBtnFace, clBlue, clMaroon);
  var   x,y: integer;
        Panel: TPanel;
begin
  for x := 1 to 7 do
    for y := 1 to 6 do
    begin
      Panel := TPanel(FindComponent('Fx' + x.ToString + 'y' + y.ToString));
      Panel.Color := Colors[TileValue[x,y]];
    end;
end;

正如大卫提到的那样,将Panel放入数组并使用它会更清晰。从您展示的代码看来,您似乎已经在设计时创建了所有面板,这不是必需的。看起来你已经拥有了42个面板,手动创建很多,如果你想让这个领域更大,它将变得更加不可行。这就是为什么最好从代码创建面板的原因:

procedure TForm1.FormCreate(Sender: TObject);
begin
  CreatePanels;
  Assign;
end;

procedure TForm1.CreatePanels;
  var x,y: integer;
begin
  for x := 1 to 7 do
    for y := 1 to 6 do
    begin
      Panels[x,y] := TPanel.Create(Self);
      Panels[x,y].Parent := Self;
      // set the position of the panel
      Panels[x,y].Left := 10 + (x-1)*50;
      Panels[x,y].Top := 10 + (y-1)*50;
      Panels[x,y].Width := 50;
      Panels[x,y].Height := 50;
      // make sure we can assign a non-default color
      Panels[x,y].ParentBackground := false;
      // do whatever else you want to do with the panel
    end;
end;

procedure TForm1.Assign;
  const Colors: array[0..2] of TColor = (clBtnFace, clBlue, clMaroon);
  var   x,y: integer;
begin
  for x := 1 to 7 do
    for y := 1 to 6 do
      Panels[x,y].Color := Colors[TileValue[x,y]];
end;

您可以在声明TileValue的地方声明Panels数组。这不仅可以使颜色分配更容易,还可以改变外观和颜色。比赛场地的维度要快得多。