我有以下代码,可以在我的标签页上的给定选项卡上循环所有组件。 我尝试过在网上找到的相同代码的许多变体,但我根本无法让它工作。 首先,我检查它是否是正确的选项卡 - 这是有效的。 然后我检查看有多少组件 - 这不起作用。即使我现在有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;
我的代码中可能出错的任何提示?
答案 0 :(得分:10)
错误的是你正在循环Components
属性。它列出了选项卡表中拥有的组件。对于在表单设计器中创建的组件,表单是所有者。因此,预期pagUsers.Properties.ActivePage.ComponentCount
为零,因为表单上唯一拥有任何内容的是表单本身。
您需要使用ControlCount
和Controls[]
来迭代标签页的子项。只需将所有使用ComponentCount
替换为ControlCount
,同样将Components[]
替换为Controls[]
。
请注意,ControlCount
和Controls[]
属性仅提供直接子项。由于您有面板,因此很可能将面板作为选项卡表的子项,并将复选框作为面板的子项。所以你需要迭代面板的子节点。
我的answer here显示了一种方法。如果您使用我在那里提供的代码,那么您对复选框的迭代可以非常简单地编写:
TabSheet := pagUsers.Properties.ActivePage;
for CheckBox in TControls.Enumerator<TcxDbCheckBox>(TabSheet) do
....