Как перебрать программно все TLabel в групбоксе?

svnvlad
Дата: 19.09.2019 10:47:11
Есть GroupBox типа TcxGroupBox. На ней несколько TLabel.
Задача стоит перебрать все лейблы и выбранную пометить ярким цветом, остальные серым.
Делаю так:
procedure HighlightStateView(AGroupBox: TcxGroupBox; ALabel: TLabel);
var
  i: integer;
begin
  for i := 0 to AGroupBox.ComponentCount - 1 do
    begin
      if (AGroupBox.Components[i] is TLabel) then
        begin
          if ((AGroupBox.Components[i] as TLabel) = ALabel) then
            DisplayLbState((AGroupBox.Components[i] as TLabel), 2) // Отображает ярким цветом
          else
            DisplayLbState((AGroupBox.Components[i] as TLabel), 1) // Отображает серым цветом
        end;
    end;
end;

Но при отладке получается, что AGroupBox.ComponentCount равно нулю.
DimaBr
Дата: 19.09.2019 10:52:28
ControlCount
Кроик Семён
Дата: 19.09.2019 11:02:19
и соответственно не Components[i], а Controls[i]
svnvlad
Дата: 19.09.2019 11:04:14
DimaBr
ControlCount

Спасибо! Так заработало:
procedure HighlightStateView(AGroupBox: TcxGroupBox; ALabel: TLabel);
var
  i: integer;
begin
  for i := 0 to AGroupBox.ControlCount - 1 do
    begin
      if (AGroupBox.Controls[i] is TLabel) then
        begin
          if ((AGroupBox.Controls[i] as TLabel) = ALabel) then
            DisplayLbState((AGroupBox.Controls[i] as TLabel), 2)
          else
            DisplayLbState((AGroupBox.Controls[i] as TLabel), 1)
        end;
    end;
end;

Чем же Components от Controls отличается?
wadman
Дата: 19.09.2019 11:05:56
svnvlad
DimaBr
ControlCount

Спасибо! Так заработало:
procedure HighlightStateView(AGroupBox: TcxGroupBox; ALabel: TLabel);
var
  i: integer;
begin
  for i := 0 to AGroupBox.ControlCount - 1 do
    begin
      if (AGroupBox.Controls[i] is TLabel) then
        begin
          if ((AGroupBox.Controls[i] as TLabel) = ALabel) then
            DisplayLbState((AGroupBox.Controls[i] as TLabel), 2)
          else
            DisplayLbState((AGroupBox.Controls[i] as TLabel), 1)
        end;
    end;
end;


Чем же Components от Controls отличается?

Не только лишь все компоненты контролы.
DimaBr
Дата: 19.09.2019 11:06:06
svnvlad
Чем же Components от Controls отличается?

Буквами
DimaBr
Дата: 19.09.2019 11:17:36
s62
Дата: 19.09.2019 15:31:09
svnvlad
Чем же Components от Controls отличается?

Есть два понятия: владелец (owner) и родитель (parent). Владелец компонента, когда вызывают его деструктор, удалит и все компоненты, которыми владеет. Владелец (owner) всех компонентов на форме - форма.
Родитель - это то, на чем визуально расположен элемент управления.
Свойство TComponent.Components перечисляет все компоненты, которыми владеет данный компонент. Свойство TWinControl.Controls перечисляет все элементы управления, которые являются детьми (child controls) по отношению к данному оконному элементу управления.
Ваш GroupBox является родителем (parent) для лейблов, но не владельцем (owner). Владелец - форма, на которой всё это. Соответственно, лейблы перечислены в свойстве Controls групбокса и в свойстве Components формы.
Док
Дата: 19.09.2019 16:52:31
s62
Свойство TComponent.Components перечисляет все компоненты, которыми владеет данный компонент. Свойство TWinControl.Controls перечисляет все элементы управления, которые являются детьми (child controls) по отношению к данному оконному элементу управления.

наконец-то, и я узнал :)

svnvlad
Задача стоит перебрать все лейблы

можно использовать InheritForm
if AGroupBox.Controls[i].InheritForm(TLabel) then
...
_Vasilisk_
Дата: 19.09.2019 19:00:23
А так будет еще лучше
procedure HighlightStateView(AGroupBox: TcxGroupBox; ALabel: TLabel);
var
  i: integer;
begin
  for i := 0 to AGroupBox.ControlCount - 1 do
    begin
      if AGroupBox.Controls[i] is TLabel then
        begin
          if AGroupBox.Controls[i] = ALabel then
            DisplayLbState(TLabel(AGroupBox.Controls[i]), 2)
          else
            DisplayLbState(TLabel(AGroupBox.Controls[i]), 1)
        end;
    end;
end;