循环TabSheet上的所有组件

OZ8*_*8HP 3 delphi components count 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;
Run Code Online (Sandbox Code Playgroud)

我的代码中可能有什么问题的任何提示?

Dav*_*nan 10

怎么了,你正在循环整个Components财产.这列出了选项卡表所拥有的组件.对于在表单设计器中创建的组件,表单是所有者.所以预计这pagUsers.Properties.ActivePage.ComponentCount是零,因为你的表单上唯一拥有任何东西的东西就是表单本身.

您需要使用ControlCountControls[]迭代选项卡表的子项.只需更换全部使用ComponentCountControlCount,同样替换Components[]Controls[].

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

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

TabSheet := pagUsers.Properties.ActivePage;
for CheckBox in TControls.Enumerator<TcxDbCheckBox>(TabSheet) do
  ....
Run Code Online (Sandbox Code Playgroud)