在 Delphi 中处理多个相似的 variables/objects
Adressing multiple, similar variables/objects in Delphi
我正在编写一个使用许多形状的程序,我需要创建一个程序将它们全部变成白色。有问题的形状被命名为 SectorBorder1 到 SectorBorder20.
有没有办法像这样或类似地处理形状?
SectorBorder[X].brush.color := ClWhite;
Inc(X);
...其中 X
是数字(显然),而不是必须这样做:
SectorBorder1.brush.color := ClWhite;
SectorBorder2.brush.color := ClWhite;
...
SectorBorder20.brush.color := ClWhite;
所以基本上可以通过变量来区分名称。这是我能想到的描述它的唯一方式。 (抱歉,有人可以提供更好的描述吗?)任何建议都将不胜感激。
使用数组
private
SectorBorders: array[1..20] of TShape;
procedure TMyForm.FormCreate(Sender: TObject):
begin
SectorBorders[1] := SectorBorder1;
..
SectorBorders[20] := SectorBorder20;
end;
procedure TMyForm.SetAllToWhite;
var
X: Integer;
begin
for X := Low(SectorBorders) to High(SectorBorders) do
SectorBorders[X].Brush.Color := clWhite;
end;
您可以使用列表来替代数组。如果您使用 System.Generics.Containers 中的 TList,您可以轻松地遍历列表的所有元素。
你这样使用它:
interface
uses System.Generics.Collections; // you need this to get the TList, you also need your other refereces of course
...
protected
pShapes: TList<TShape>;
procedure TMyForm.FormCreate(Sender: TObject):
var
nLoop: Integer;
begin
Self.pShapes:=TList<TShape>.Create;
nLoop:=0;
while(nLoop<Self.ComponentCount) do
begin
if(Self.Components[nLoop] is TShape) then
pList.Add(TShape(Self.Components[nLoop]));
Inc(nLoop);
end;
end;
procedure TMyForm.SetAllToWhite;
var
pShape: TShape;
begin
for pShape in Self.pShapes do
pShape.Brush.Color := clWhite;
end;
选择使用数组还是 TList 将部分取决于偏好,但也取决于您可能希望对 TShape 集合执行的其他操作以及它们在对象中的管理方式。
可以使用窗体的FindComponent方法
shape:= FindComponent('SectorBorder' + IntToStr(i)) as TShape;
if shape <> nil then
pShape.Brush.Color := clWhite;
见http://docwiki.embarcadero.com/CodeExamples/Sydney/en/FindComponent_(Delphi)
我正在编写一个使用许多形状的程序,我需要创建一个程序将它们全部变成白色。有问题的形状被命名为 SectorBorder1 到 SectorBorder20.
有没有办法像这样或类似地处理形状?
SectorBorder[X].brush.color := ClWhite;
Inc(X);
...其中 X
是数字(显然),而不是必须这样做:
SectorBorder1.brush.color := ClWhite;
SectorBorder2.brush.color := ClWhite;
...
SectorBorder20.brush.color := ClWhite;
所以基本上可以通过变量来区分名称。这是我能想到的描述它的唯一方式。 (抱歉,有人可以提供更好的描述吗?)任何建议都将不胜感激。
使用数组
private
SectorBorders: array[1..20] of TShape;
procedure TMyForm.FormCreate(Sender: TObject):
begin
SectorBorders[1] := SectorBorder1;
..
SectorBorders[20] := SectorBorder20;
end;
procedure TMyForm.SetAllToWhite;
var
X: Integer;
begin
for X := Low(SectorBorders) to High(SectorBorders) do
SectorBorders[X].Brush.Color := clWhite;
end;
您可以使用列表来替代数组。如果您使用 System.Generics.Containers 中的 TList,您可以轻松地遍历列表的所有元素。
你这样使用它:
interface
uses System.Generics.Collections; // you need this to get the TList, you also need your other refereces of course
...
protected
pShapes: TList<TShape>;
procedure TMyForm.FormCreate(Sender: TObject):
var
nLoop: Integer;
begin
Self.pShapes:=TList<TShape>.Create;
nLoop:=0;
while(nLoop<Self.ComponentCount) do
begin
if(Self.Components[nLoop] is TShape) then
pList.Add(TShape(Self.Components[nLoop]));
Inc(nLoop);
end;
end;
procedure TMyForm.SetAllToWhite;
var
pShape: TShape;
begin
for pShape in Self.pShapes do
pShape.Brush.Color := clWhite;
end;
选择使用数组还是 TList 将部分取决于偏好,但也取决于您可能希望对 TShape 集合执行的其他操作以及它们在对象中的管理方式。
可以使用窗体的FindComponent方法
shape:= FindComponent('SectorBorder' + IntToStr(i)) as TShape;
if shape <> nil then
pShape.Brush.Color := clWhite;
见http://docwiki.embarcadero.com/CodeExamples/Sydney/en/FindComponent_(Delphi)