Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在选项卡上循环所有组件_Delphi_Count_Components_Ttabsheet - Fatal编程技术网

Delphi 在选项卡上循环所有组件

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

我有下面的代码,它应该在我的tabsheet的给定选项卡上循环所有组件。 我已经尝试了许多在网上找到的相同代码的变体,但我就是不能让它工作。 首先,我检查它是否是正确的标签-这是有效的。 然后我检查有多少组件——这不起作用。它显示0个组件,尽管我现在知道总共有2个面板和9个复选框

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中的复选框
....