【问题标题】:Adressing multiple, similar variables/objects in Delphi在 Delphi 中处理多个相似的变量/对象
【发布时间】:2021-04-28 13:29:29
【问题描述】:

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

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

SectorBorder[X].brush.color := ClWhite;
Inc(X);

...其中X 是数字(显然),而不是必须这样做:

SectorBorder1.brush.color := ClWhite;
SectorBorder2.brush.color := ClWhite;
...
SectorBorder20.brush.color := ClWhite;

所以基本上能够通过变量来区分名称。这是我能想到的描述它的唯一方式。 (抱歉,有人还可以提供更好的说明吗?)任何建议都将不胜感激。

【问题讨论】:

  • 您可以为此使用数组。或列表。

标签: variables delphi pascal naming


【解决方案1】:

使用数组

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;

【讨论】:

    【解决方案2】:

    作为数组的替代方案,您可以使用列表。如果您使用 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 将部分取决于偏好,但也取决于您可能想要对 TShapes 集合做什么以及如何在对象中管理它们。

    【讨论】:

      【解决方案3】:

      您可以使用表单的 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)

      【讨论】:

      • 请注意,如果您有一个名为“SectorBorder99”的非 TShape 组件,您将在“as”阶段遇到异常。首先找到组件然后检查(使用“is”)您找到的组件是否 TShape(或其子级)更安全。
      • 另外,在大多数情况下,FindComponent(通常通过字符串名称来引用组件)是一种反模式。
      • 是的 - 您冒着后来的开发人员进来并重命名/制作一个新组件的风险,由于您假设他不知道而突然使您的程序崩溃。
      猜你喜欢
      • 2022-11-02
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      相关资源
      最近更新 更多