循环TabSheet上的所有组件

时间:2013-03-17 17:21:26

标签: delphi count components ttabsheet

我有以下代码,可以在我的标签页上的给定选项卡上循环所有组件。 我尝试过在网上找到的相同代码的许多变体,但我根本无法让它工作。 首先,我检查它是否是正确的选项卡 - 这是有效的。 然后我检查看有多少组件 - 这不起作用。即使我现在有2个面板共有9个复选框,它也会显示0个组件。

procedure TfrmHsUsers.pagUsersClick(Sender: TObject);
var
  i: integer;
  Fieldname: string;
begin
  if pagUsers.Properties.ActivePage.Name = 'tabProgram' then
    begin
ShowMessage(IntToStr(pagUsers.Properties.ActivePage.ComponentCount));
      for i := 0 to pagUsers.Properties.ActivePage.ComponentCount - 1 do
        if (pagUsers.Properties.ActivePage.Components[i]) is TcxDbCheckBox then
          begin
            Fieldname := TcxDbCheckBox(pagUsers.Properties.ActivePage.Components[i]).DataBinding.DataField;
            TcxDbCheckBox(pagUsers.Properties.ActivePage.Components[i]).Enabled := Settings.License.IsEnabled(Fieldname);
          end;
    end;
end;

我的代码中可能出错的任何提示?

1 个答案:

答案 0 :(得分:10)

错误的是你正在循环Components属性。它列出了选项卡表中拥有的组件。对于在表单设计器中创建的组件,表单是所有者。因此,预期pagUsers.Properties.ActivePage.ComponentCount为零,因为表单上唯一拥有任何内容的是表单本身。

您需要使用ControlCountControls[]来迭代标签页的子项。只需将所有使用ComponentCount替换为ControlCount,同样将Components[]替换为Controls[]

请注意,ControlCountControls[]属性仅提供直接子项。由于您有面板,因此很可能将面板作为选项卡表的子项,并将复选框作为面板的子项。所以你需要迭代面板的子节点。

我的answer here显示了一种方法。如果您使用我在那里提供的代码,那么您对复选框的迭代可以非常简单地编写:

TabSheet := pagUsers.Properties.ActivePage;
for CheckBox in TControls.Enumerator<TcxDbCheckBox>(TabSheet) do
  ....