在 Delphi 中处理多个相似的 variables/objects

Adressing multiple, similar variables/objects in Delphi

我正在编写一个使用许多形状的程序,我需要创建一个程序将它们全部变成白色。有问题的形状被命名为 SectorBorder1SectorBorder20.

有没有办法像这样或类似地处理形状?

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)