我有一个带有一堆控件的表单,我想遍历某个面板上的所有控件并启用/禁用它们。
我尝试过:
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;
有人请告诉我,还有更好的方法...
您正在寻找TWinControl.Controls
数组和随附的ControlCount
属性。这些是控件的直接子对象。要获取孙辈等,请使用标准的递归技术。
您实际上并不想要Components
数组(这是for
-in
循环所迭代的内容),因为通常它与父子关系无关。组件可以拥有没有子关系的事物,而控件可以拥有它们不拥有的子关系。
还要注意,禁用控件也会隐式禁用其所有子级。您不能与已禁用控件的孩子互动。操作系统不会向他们发送输入消息。但是,要禁用它们[[look,则需要分别禁用它们。也就是说,即使按钮不会响应鼠标单击,也要使按钮的文本变为灰色,这还不足以禁用其父项。您需要禁用按钮本身以使其“禁用”绘画。