Вы просматриваете базовый список TWinControl.Controls[]
Группы, когда вам следует вместо этого просматривать список TCategoryPanelGroup.Panels
.
Что касается того, почему вы видите TCategoryPanelSurface
, то TCategoryPanel
создает этообъект как непосредственное дитя самого себя в своем конструкторе.Любой элемент управления, который вы помещаете в Panel впоследствии, на самом деле является потомком этого TCategoryPanelSurface
объекта, а не потомком самого TCategoryPanel
.Вот почему ваш цикл никогда не видит эти элементы управления.
К сожалению, TCategoryPanel
не предоставляет прямой доступ к своему TCategoryPanelSurface
объекту.Таким образом, чтобы пройти через его дочерние элементы, вы должны сначала иметь доступ к нему.Есть два возможных способа сделать это:
1)
procedure TForm1.Button2Click(Sender: TObject);
var
i, j: integer;
panel: TCategoryPanel;
surface: TCategoryPanelSurface;
begin
for i := 0 to CategoryPanelGroup1.Panels.Count-1 do
begin
panel := TCategoryPanel(CategoryPanelGroup1.Panels[i]);
ShowMessage(panel.Caption);
surface := panel.Controls[0] as TCategoryPanelSurface;
for j := 0 to surface.ControlCount-1 do
begin
ShowMessage(surface.Controls[j].ClassName);
end;
end;
end;
2)
type
TCategoryPanelAccess = class(TCategoryPanelAccess)
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i, j: integer;
panel: TCategoryPanel;
surface: TCategoryPanelSurface;
begin
for i := 0 to CategoryPanelGroup1.Panels.Count-1 do
begin
panel := TCategoryPanel(CategoryPanelGroup1.Panels[i]);
ShowMessage(panel.Caption);
surface := TCategoryPanelAccess(panel).FPanelSurface;
for j := 0 to surface.ControlCount-1 do
begin
ShowMessage(surface.Controls[j].ClassName);
end;
end;
end;