4

我有以下代码应该循环我的标签页上给定标签上的所有组件。我已经尝试了许多在网上找到的相同代码的变体,但我根本无法让它工作。首先,我检查它是否是正确的选项卡 - 有效。然后我检查看看有多少组件 - 这不起作用。尽管我现在有 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;

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

4

1 回答 1

11

问题是您正在循环访问该Components属性。这列出了选项卡表拥有的组件。对于在表单设计器中创建的组件,表单是所有者。所以预计pagUsers.Properties.ActivePage.ComponentCount为零,因为表单上唯一拥有任何东西的东西就是表单本身。

您需要做的是使用ControlCountControls[]迭代标签表的子项。只需将所有使用替换为ComponentCountControlCount同样替换Components[]Controls[]

请注意,ControlCountandControls[]属性只给出直接子级。由于您有面板,因此您很可能将面板作为选项卡的子级,而将复选框作为面板的子级。所以你需要遍历面板的孩子。

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

TabSheet := pagUsers.Properties.ActivePage;
for CheckBox in TControls.Enumerator<TcxDbCheckBox>(TabSheet) do
  ....
于 2013-03-17T17:25:55.273 回答