Почему TCategoryPanel.controls [i] .className всегда "TCategoryPanelSurface? - PullRequest
4 голосов
/ 24 июня 2010

В форму я положил 1 х TCategoryPanelGroup объект и добавил к нему 3 TCategoryPanel. В процедуре мне нужно пройти через каждый из TCategoryPanel и через каждый объект на этой панели, чтобы получить вывод.

Итак, вот код ... почему во втором FOR вместо того, чтобы давать мне имя класса каждого компонента (т.е. TButton, TLabel и т. Д.), Он выдает TCategoryPanelSurface?

Короткий вопрос: Как я могу получить доступ к каждому элементу управления с каждой TCategoryPanel?


procedure TForm1.Button2Click(Sender: TObject);
    var i,i2 : integer;

    begin
      for i := 0 to CategoryPanelGroup1.ControlCount-1 do
      begin
        showMessage((CategoryPanelGroup1.Controls[i] as TCategoryPanel).caption ) ;

        for i2 := 0 to (CategoryPanelGroup1.Controls[i] as TCategoryPanel).ControlCount-1 do
        begin

          showMessage((CategoryPanelGroup1.Controls[i] as TCategoryPanel).Controls[i2].ClassName);
        end;
      end;
    end;

1 Ответ

3 голосов
/ 24 июня 2010

Вы просматриваете базовый список 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; 
...