Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > CategoryButtons и CategoryPanelGroup


Автор: stalkerok 30.12.2008, 17:49
В Delphi 2009 есть два компонента CategoryButtons и CategoryPanelGroup, как сделать так чтобы при разворачивании списка все остальные сворачивались? в CategoryPanelGroup есть метод Expand но не хочется каждый раз его прописывать а в CategoryButtons у списков вобще нет методов, как быть?
Заранее спасибо!

Автор: stalkerok 31.12.2008, 13:16
в CategoryPanelGroup
можно сделать так:
Код

//******************************************************************************
//Сворачивание панелей
procedure TfrmMain.CollapseAll(p: integer);
begin
  if (not (p = 1)) then CategoryPanel1.Collapse;
  if (not (p = 2)) then CategoryPanel2.Collapse;
  if (not (p = 3)) then CategoryPanel3.Collapse;
  if (not (p = 4)) then CategoryPanel4.Collapse;
end;
//1
procedure TfrmMain.CategoryPanel1Expand(Sender: TObject);
begin
  CollapseAll(1);
end;
//2
procedure TfrmMain.CategoryPanel2Expand(Sender: TObject);
begin
  CollapseAll(2);
end;
//3
procedure TfrmMain.CategoryPanel3Expand(Sender: TObject);
begin
  CollapseAll(3);
end;
//4
procedure TfrmMain.CategoryPanel4Expand(Sender: TObject);
begin
  CollapseAll(4);
end;

но не совсем удобно когда много CategoryPanel.
а в CategoryButtons как сделать? 

Автор: Hellen 16.3.2009, 21:59
Продолжай!!!   мы слушаем.

Автор: Galus 5.5.2011, 17:18
Код

procedure TfrmMain.CollapseAll(CatPanel: TCategoryPanel);
var
  i: integer;
  CP: TCategoryPanel;
begin
  CP := (FindComponent('CategoryPanel' + inttostr(i)) as TCategoryPanel);
  for i = 1 to CategoryPanelGroup1.Panels.Count do CP.Collapsed = (not (CP = CatPanel));  
end;


На каждую из панелей вешаем событие:
Код

procedure TfrmMain.CategoryPanelExpand(Sender: TObject);
begin
  CollapseAll(Sender as TCategoryPanel);
end;


От количества панелей ничего не зависит. Главное чтобы нумерация панелей шла от CategoryPanel1 до CategoryPanelN, где N - количество панелей, без скачков через одну. Т.е. вариант типа CategoryPanel1, CategoryPanel3 не прокатит, нужно чтобы обязательно была ещё и CategoryPanel2.

Добавлено через 2 минуты и 37 секунд
Даже проще. На каждую панель событие:
Код

procedure TfrmMain.CategoryPanelExpand(Sender: TObject);
var
  i: integer;
  CP: TCategoryPanel;
begin
  CP := (FindComponent('CategoryPanel' + inttostr(i)) as TCategoryPanel);
  for i = 1 to CategoryPanelGroup1.Panels.Count do CP.Collapsed = (not (CP = (Sender as TCategoryPanel)));


Автор: MetalFan 6.5.2011, 10:36
Galus, код то свой хоть бы проверили...

Автор: Galus 11.5.2011, 18:11
Извиняюсь. Дома без Делфи сижу. smile
Код

procedure TfrmMain.CategoryPanelExpand(Sender: TObject);
var
  i: integer;
  CP: TCategoryPanel;
begin
  for i = 1 to CategoryPanelGroup1.Panels.Count do
  begin
    CP := (FindComponent('CategoryPanel' + inttostr(i)) as TCategoryPanel);
    CP.Collapsed = (not (CP = (Sender as TCategoryPanel)));
  end;
  CategoryPanelGroup1.Realign;
end;

Теперь вроде всё правильно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)