delphi - 如何引用名称在运行时确定的控件?

标签 delphi

作为一种自学练习,我制作了一个表单,其中包含 2x3 矩形中的六个面板,我希望它们在可见和不可见之间依次切换。我试图通过使用某种 for 循环来做到这一点。我当然可以写这样的东西:

Panel1.Visible := true;
Panel1.Visible := false;
Panel2.Visible := true;
Panel2.Visible := false;
Panel3.Visible := true;
etc. etc.

但是,当我决定希望它在每个步骤之间等待 100 毫秒时,这需要大量输入,并且效率非常低。例如,我必须编辑所有六个步骤才能等待。这六个步骤是可行的,但也许下次我想这样做一百次!所以我认为还必须有一种方法来使用 for 循环,其中变量从 1 到 6 变化,并在对象标识符中使用。所以它会是这样的:

for variable := 1 to 6 do begin
Panel + variable.Visible := true;
Panel + variable.Visible := false;
end;

现在,这显然行不通,但我希望这里有人能告诉我这是否实际上可能,如果可能,如何实现。也许我可以使用字符串作为标识符?我的解释可能很糟糕,因为我不知道所有的技术术语,但我希望代码能解释一些东西。

最佳答案

您可以循环访问面板的 Owner 的 Components 数组。

var
  i: Integer;
  TmpPanel: TPanel;
begin
  { This example loops through all of the components on the form, and toggles the
    Visible property of each panel to the value that is opposite of what it has (IOW,
    if it's True it's switched to False, if it's False it's switched to True). }
  for i := 0 to ComponentCount - 1 do                  
    if Components[i] is TPanel then                    
    begin
      TmpPanel := TPanel(Components[i]);
      TmpPanel.Visible := not TmpPanel.Visible;     // Toggles between true and false
    end;
end;

如果您想要按名称查找非常特定类型的组件,还可以使用 FindComponent 方法。例如,如果您有 6 个面板,它们的名称为 Panel1Panel2 等:

var
  i: Integer;
  TmpPanel: TPanel;
begin
  for i := 1 to 6 do
  begin
    TmpPanel := FindComponent('Panel' + IntToStr(i)) as TPanel;
    if TmpPanel <> nil then      // We found it
      TmpPanel.Visible := not TmpPanel.Visible;
  end;
end;

关于delphi - 如何引用名称在运行时确定的控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649250/

相关文章:

delphi - Spring4D TDistinctIterator<string>.ToArray() 不工作?

c++ - Delphi 中的类型转换指针添加

delphi - 随机 Indy 响应代码 = -1/EIdSocketError 套接字错误 # 0 异常

每次运行项目时,Delphi XE5 都会重新编译。即使没有进行任何更改也会发生这种情况

delphi - 类型差异

delphi - Dunit 控制台模式 - 执行测试两次

delphi - 如何让SynEdit自动换行与Memo一样?

delphi - 使用雅虎! Delphi 中的查询语言 (YQL)

delphi - 将 FPC .o 文件链接到 Delphi

delphi - 用delphi通过互联网在两台计算机之间发送短信?