Зацикливание всех компонентов на 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;

Любые намеки на то, что может быть не так в моем коде?

1 ответ

Решение

Что плохого в том, что вы перебираете Components имущество. В нем перечислены компоненты, которые принадлежат вкладке. Для компонентов, созданных в конструкторе форм, форма является владельцем. Так что ожидается, что pagUsers.Properties.ActivePage.ComponentCount равен нулю, поскольку единственная вещь в вашей форме, которая владеет чем-либо, это сама форма.

Что вам нужно, это использовать ControlCount а также Controls[] перебирать дочерних элементов вкладки. Просто замените все использование ComponentCount с ControlCountи аналогично заменить Components[] с Controls[],

Обратите внимание, что ControlCount а также Controls[] свойства дают только непосредственные дети. Поскольку у вас есть панели, вы, скорее всего, будете использовать их как дочерние элементы вкладки, а флажки как дочерние элементы панелей. Так что вам нужно перебрать дочерние элементы панелей.

Мой ответ здесь показывает один из способов сделать это. Если вы используете код, который я представил там, то ваша итерация по флажкам может быть написана очень просто:

TabSheet := pagUsers.Properties.ActivePage;
for CheckBox in TControls.Enumerator<TcxDbCheckBox>(TabSheet) do
  ....
Другие вопросы по тегам