Как перечислить все элементы управления, удерживаемые TCategoryPanel? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть TCategoryPanelGroup, которая содержит одну TCategoryPanel (названную CatPan). CatPan содержит 3 списка.

Я хочу автоматически изменить размер CatPan, чтобы он соответствовал высоте трех списков, которые он содержит. Но у CatPan нет свойства AutoSize. Поэтому мне нужно перечислить списки, чтобы получить их высоту.

Однако я ничего не получаю при попытке перечислить 3 списка:

for i= 0 to CatPan->ControlCount-1 do CatPan[i].Height;

потому что CatPan.ControlCount возвращает 1 вместо 3 !!! Кажется, что CapPan не является родителем списков. Вероятно, это делается для того, чтобы можно было сделать анимацию свертывания / развертывания.

Я вызвал lbox1-> Parent-> Name (lbox1 - один из списков), чтобы увидеть, кто является его родителем, но он возвращает пустую строку.

1 Ответ

0 голосов
/ 29 октября 2018

Вам не хватает того, что TCategoryPanel создает объект TCategoryPanelSurface в качестве дочернего элемента в своем конструкторе, поэтому все элементы управления переходят в объект TCategoryPanelSurface, а НЕ в TCategoryPanel.

В C ++ Builder это выглядит так:

ShowMessage(ListBox1->Parent->ClassName()); //you can see actual parent class here
TCategoryPanelSurface  * Surface;
Surface = dynamic_cast <TCategoryPanelSurface *> (CatPan->Controls[0]);
ShowMessage(Surface->ControlCount);
ShowMessage(Surface->Controls[0]->Name); //you should use loop here to iterate through controls

В Delphi:

var
  Surface: TCategoryPanelSurface;
  I: Integer;
begin
  Surface := CatPan.Controls[0] as TCategoryPanelSurface;
  for I := 0 to Surface.ControlCount - 1 do
  begin
    ShowMessage(Surface.Controls[I].Name);
  end;
end;
...