我可能有一个非常简单的修复问题,虽然我不知道如何做到这一点。我对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;
这甚至可能吗?如果是或否,请告诉我。
答案 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数组。这不仅可以使颜色分配更容易,还可以改变外观和颜色。比赛场地的维度要快得多。