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