【问题标题】:How to get all components (Tlabel,Tedit ...) in a form in Delphi?如何在 Delphi 的表单中获取所有组件(Tlabel,Tedit ...)?
【发布时间】:2015-09-21 18:50:04
【问题描述】:

我成功编写了一个运行时事件,当我重新调整表单大小时,它会改变我的 TLabel 的大小

procedure TForm3.pack(Sender: TObject);
begin
    Label1.Font.Size:=Floor(50*(Form3.Width/Screen.Width)*(Form3.Height/Screen.Height));
end; 

现在我想获取表单上所有组件的数组,所以我循环并重新调整它们的大小。

如果有预定义的选项或程序,请提供任何帮助,谢谢告诉我(例如响应式)

谢谢

【问题讨论】:

  • 使用Controls[] 属性
  • @DavidHeffernan 好的,我会找的,谢谢
  • 这不是锚点的用途吗?
  • @TobyAllen 我不知道,因为我两天前开始使用 delphi(我是 3 年的 Java 开发人员,我通过玩一些代码来迁移)
  • 玩弄对象属性托盘上的锚点,您会看到可以自动调整控件的大小。设置锚点,然后调整表单大小。

标签: delphi delphi-xe8


【解决方案1】:

您可以使用表单的Controls 属性。由于所有控件都继承自TControl,并且TControl 具有Font 属性,因此它非常容易(尽管该属性在TControl 中受到保护,因此您需要一个插入器类):

type
  TCtrl = class(TControl);

var
  i: Integer;
  NewSize: Integer;
begin
  NewSize := Floor(50*(Form3.Width/Screen.Width)*(Form3.Height/Screen.Height));
  for i := 0 to ControlCount - 1 do
    TCtrl(Controls[i]).Font.Size := NewSize;
end;

请注意,某些控件(例如 TPanelTTabSheet)可以作为其他控件的父级,因此它们将拥有自己的 Controls 列表。您还需要遍历这些内容。

【讨论】:

  • 你可能需要在循环内递归孙子等等
  • 最好是这样的方法procedure HandleChildren( Parent: TControl; Action: TProc<TControl>; Filter: TPredicate<TControl>; Recurse: Boolean = False );。现在你有了一个全局工具
  • 可能。这个问题是“在我的表格上”提出的。我会把它留给海报来尝试这样做;如果他们不能这样做,我可以延长它。
  • 您应该只提及父/子关系。这个问题本身就得到了回答。剩下的只是糖:o)
  • 我创建了 TControl 的本地后代。后代可以访问其父类的受保护成员。因为我们知道Controls[] 中的所有内容都是 TControl,所以对我们新后代的类型转换是安全的。如果你想改变TControl 本身的行为,你最好在你自己的后代中这样做;修改所有 TControl 后代的行为可能会产生您意想不到的副作用。由于我不知道您具体想要修改什么,因此我无法在该领域提供建议(而且 cmets 也不是尝试这样做的合适场所)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 2016-03-11
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
相关资源
最近更新 更多