有没有办法将所有控件都放在容器控件上?

问题描述 投票:13回答:6

我有一个带有一堆控件的表单,我想遍历某个面板上的所有控件并启用/禁用它们。

我尝试过:

var component: TComponent;
begin
  for component in myPanel do
    (component as TControl).Enabled := Value;
end;

但是那没做。事实证明,所有组件都在表单的组件集合中,而不是其父对象的集合中。那么,有谁知道是否有办法将所有控件都包含在控件中? (除了这种丑陋的解决方法,这是我最终要做的事情):

var component: TComponent;
begin
  for component in myPanel do
    if (component is TControl) and (TControl(component).parent = myPanel) then
      TControl(component).Enabled := Value;
end;

有人请告诉我,还有更好的方法...

delphi forms controls iterator vcl
6个回答
25
投票

您正在寻找TWinControl.Controls数组和随附的ControlCount属性。这些是控件的直接子对象。要获取孙辈等,请使用标准的递归技术。

您实际上并不想要Components数组(这是for-in循环所迭代的内容),因为通常它与父子关系无关。组件可以拥有没有子关系的事物,而控件可以拥有它们不拥有的子关系。

还要注意,禁用控件也会隐式禁用其所有子级。您不能与已禁用控件的孩子互动。操作系统不会向他们发送输入消息。但是,要禁用它们[[look,则需要分别禁用它们。也就是说,即使按钮不会响应鼠标单击,也要使按钮的文本变为灰色,这还不足以禁用其父项。您需要禁用按钮本身以使其“禁用”绘画。


13
投票
如果禁用面板,则其所有控件也将被禁用。

2
投票
这里是Delphi 2007的方式:

1
投票
只需

1
投票
这会找到所有控件,它们也嵌套在框架中,并通过列表指向它们。请注意,之后释放列表。

0
投票
我知道这篇文章有些旧,但是我是根据对相同信息的搜索来到这里的。这是我为有兴趣的人设计的一些C ++代码。
© www.soinside.com 2019 - 2024. All rights reserved.