Delphi 在选项卡上循环所有组件
我有下面的代码,它应该在我的tabsheet的给定选项卡上循环所有组件。 我已经尝试了许多在网上找到的相同代码的变体,但我就是不能让它工作。 首先,我检查它是否是正确的标签-这是有效的。 然后我检查有多少组件——这不起作用。它显示0个组件,尽管我现在知道总共有2个面板和9个复选框Delphi 在选项卡上循环所有组件,delphi,count,components,ttabsheet,Delphi,Count,Components,Ttabsheet,我有下面的代码,它应该在我的tabsheet的给定选项卡上循环所有组件。 我已经尝试了许多在网上找到的相同代码的变体,但我就是不能让它工作。 首先,我检查它是否是正确的标签-这是有效的。 然后我检查有多少组件——这不起作用。它显示0个组件,尽管我现在知道总共有2个面板和9个复选框 procedure TfrmHsUsers.pagUsersClick(Sender: TObject); var i: integer; Fieldname: string; begin if pagUs
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;
有没有提示我的代码中可能有什么错误?错误的是,您在
组件
属性上循环。其中列出了选项卡工作表所拥有的零部件。对于在表单设计器中创建的组件,表单是所有者。因此预计pagUsers.Properties.ActivePage.ComponentCount
为零,因为表单上唯一拥有任何东西的就是表单本身
您需要使用ControlCount
和Controls[]
来迭代选项卡工作表的子项。只需将组件计数
的所有用法替换为控件计数
,同样地,将组件[]
替换为控件[]
请注意,ControlCount
和Controls[]
属性只提供直接子级。因为您有面板,所以最有可能将面板作为选项卡工作表的子级,将复选框作为面板的子级。因此,您需要迭代面板的子级
我的研究表明了一种方法。如果您使用我在这里介绍的代码,那么您在复选框上的迭代可以非常简单地编写:
TabSheet := pagUsers.Properties.ActivePage;
for CheckBox in TControls.Enumerator<TcxDbCheckBox>(TabSheet) do
....
TabSheet:=pagUsers.Properties.ActivePage;
对于TControls.Enumerator(TabSheet)do中的复选框
....