Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как перебрать программно все TLabel в групбоксе?  [new]
svnvlad
Member

Откуда:
Сообщений: 2072
Есть 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 равно нулю.
19 сен 19, 10:47    [21973957]     Ответить | Цитировать Сообщить модератору
 Re: Как перебрать программно все TLabel в групбоксе?  [new]
DimaBr
Member

Откуда:
Сообщений: 11335
ControlCount
19 сен 19, 10:52    [21973966]     Ответить | Цитировать Сообщить модератору
 Re: Как перебрать программно все TLabel в групбоксе?  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6571
и соответственно не Components[i], а Controls[i]
19 сен 19, 11:02    [21973974]     Ответить | Цитировать Сообщить модератору
 Re: Как перебрать программно все TLabel в групбоксе?  [new]
svnvlad
Member

Откуда:
Сообщений: 2072
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 отличается?
19 сен 19, 11:04    [21973977]     Ответить | Цитировать Сообщить модератору
 Re: Как перебрать программно все TLabel в групбоксе?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26157
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 отличается?

Не только лишь все компоненты контролы.
19 сен 19, 11:05    [21973979]     Ответить | Цитировать Сообщить модератору
 Re: Как перебрать программно все TLabel в групбоксе?  [new]
DimaBr
Member

Откуда:
Сообщений: 11335
svnvlad
Чем же Components от Controls отличается?

Буквами
19 сен 19, 11:06    [21973980]     Ответить | Цитировать Сообщить модератору
 Re: Как перебрать программно все TLabel в групбоксе?  [new]
DimaBr
Member

Откуда:
Сообщений: 11335


К сообщению приложен файл. Размер - 20Kb
19 сен 19, 11:17    [21973998]     Ответить | Цитировать Сообщить модератору
 Re: Как перебрать программно все TLabel в групбоксе?  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1010
svnvlad
Чем же Components от Controls отличается?

Есть два понятия: владелец (owner) и родитель (parent). Владелец компонента, когда вызывают его деструктор, удалит и все компоненты, которыми владеет. Владелец (owner) всех компонентов на форме - форма.
Родитель - это то, на чем визуально расположен элемент управления.
Свойство TComponent.Components перечисляет все компоненты, которыми владеет данный компонент. Свойство TWinControl.Controls перечисляет все элементы управления, которые являются детьми (child controls) по отношению к данному оконному элементу управления.
Ваш GroupBox является родителем (parent) для лейблов, но не владельцем (owner). Владелец - форма, на которой всё это. Соответственно, лейблы перечислены в свойстве Controls групбокса и в свойстве Components формы.
19 сен 19, 15:31    [21974381]     Ответить | Цитировать Сообщить модератору
 Re: Как перебрать программно все TLabel в групбоксе?  [new]
Док
Member

Откуда: Казань
Сообщений: 6462
s62
Свойство TComponent.Components перечисляет все компоненты, которыми владеет данный компонент. Свойство TWinControl.Controls перечисляет все элементы управления, которые являются детьми (child controls) по отношению к данному оконному элементу управления.

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

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

можно использовать InheritForm
if AGroupBox.Controls[i].InheritForm(TLabel) then
...
19 сен 19, 16:52    [21974477]     Ответить | Цитировать Сообщить модератору
 Re: Как перебрать программно все TLabel в групбоксе?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11279
А так будет еще лучше
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;
19 сен 19, 19:00    [21974639]     Ответить | Цитировать Сообщить модератору
 Re: Как перебрать программно все TLabel в групбоксе?  [new]
DimaBr
Member

Откуда:
Сообщений: 11335
procedure HighlightStateView(AGroupBox: TcxGroupBox; ALabel: TLabel);
var i: integer;
begin
  for i := 0 to AGroupBox.ControlCount - 1 do
    if AGroupBox.Controls[i] is TLabel then
      DisplayLbState(TLabel(AGroupBox.Controls[i]), AGroupBox.Controls[i] = ALabel);
end;
19 сен 19, 20:26    [21974695]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить