Delphi programming blog
Источник: http://teran.karelia.pro/articles/item_4446.html
 

Использование TCategoryButtons

Опубликовано 26.11.2010 г. 15:50
Начиная кажется с версии 2009 (а может и 2007) в палитре компонентов появился новый элемент TCategoryButtons. Весьма своеобразный компонент.
Решил использовать его в работе для решения практической задачи. На на настоящий момент на главной форме программы есть несколько групп обычных TButton. Все они содержатся в TGroupBox'ах по категориям. Надписи на кнопках достаточно большие, поэтому размер кнопок тоже великоват. выглядит все это не эстетично и т.д. Решил заменить все эти кнопки на компонент TCategoryButtons, тогда все TGroupBox плавно переделаются в TButtonCategory а кнопки в TButtonItem. Каждая из представленных кнопок открывает какую то форму. Причем все было реализовано, далеко не лучшим образом, каждая кнопка имела свой обработчик. в котором было написано что то вроде, form4.show() или with TForm5.Create() do show(). Т.е в принципе почти что дублирование кода. И понятное дело что такие вещи можно реализовывать в одном общем обработчике. Правда, надо отметить, что присутствует в коде еще и функция для создания произвольной формы следующего вида:
procedure TForm1.CreateCustomChildForm(formClass: TFormClass; title: string = '');
begin
    with formClass.Create(Self) do begin
        if title  '' then caption := title;
        Show();
    end;
end;
тогда мы можем вызывать ее, например, так:
CreateCustomChildForm(TForm1);
CreateCsutomChildForm(TForm2,'asd');
и получать соответствующие формы. Но вернемся к CategoryButtons. Итак поместив на форму сей компонент, добавим в него нужные категории. Увлекательно, все они разных цветов. И сам компонент не имеет настройки для отключения этой разноцветности, кажется. Прийдется ткнуть в каждую категорию, и установить gradientColor в clNone. Добавим необходимые кнопки. И теперь мы хотим назначить всем им общий обработчик onClick. Ок. создали метод, прошлись по всем кнопкам, выбрали этот метод. Тестируем. запускаем программу, жмем на кнопку. опа, sender = CategoryButtons. Как узнать на какую кнопку я нажал? отыскать текущий элемент? должно быть проще. Смотрим события у самого компонента TCategoryButtons. Находим событие onButtonClicked. Ок. Вызывается при клике на любую кнопку, получает в качестве sender'а нажатую кнопку. Замечательно. Теперь нам надо кнопку как то идентифицировать, чтобы знать какую форму следует отображать/создавать. Вот если бы мы писали что то вроде калькулятора, то для каждой кнопки указали бы свое свойство tag и по нему идентифицировали бы нужную. Прекрасно, но ничего подобного, для элементов TButtonItem нет. Все что мы можем поменять для отдельной кнопки, это заголовок, подсказку, и номер иконки. Прелестно. Значит нам необходим просто хотя бы какой то индекс кнопки. только не в категории, а вообще в полном списке. так сказать сквозная нумерация. И опять такого нет. Есть лишь индекс кнопки в группе, и индекс группы. Чтобы посчитать сквозной потребуется узнавать сколько в каждой группе кнопок. не удобно. Ну да ладно. кнопкой у нас будет не так уж много. Так что будем действовать в предположении что их не более 50 в группе. Тогда индекс кнопки посчитаем как 50*(индекс группы) + индекс кнопки. Что же. В итоге общий код имеет следующий вид:
procedure TForm1.CategoryButtonsButtonClicked(Sender: TObject; const Button: TButtonItem);
var item_index : integer;
    formClass : TFormClass;
    i : integer;
begin
    item_index := button.Category.ID*100 + button.ID;

    case item_index of
        0 :   formClass := TForm1;
        1 :   formClass := TForm2;
        2 :   formClass := TForm3;
        100 : formClass := TForm4;
        101 : formClass := TForm5;
        200 : formClass := TForm6;
        201 : formClass := TForm7;
    end;
    for i:= 0 to Screen.FormCount - 1 do begin
        if screen.Forms[i] is formClass then begin
            screen.Forms[i].Show();
            exit;
        end;
    end;

    CreateCustomChildForm(formClass);
end;
Это позволяет нам показать форму, если она создана, но скрыта. Или создать новую. Естественно подразумевается, что список кнопок у нас постоянный. Т.е нет никакого динамического построения. Но вот напоследок еще один фокус. Хотите сделать так, чтобы на небольшой ширины кнопке отображался длинный текст? это у вас не получится. свойства wordwrap у них нет. Странный компонент. Второй раз его использую в работе. И каждый раз он начинает меня бесить (:
Метки:  TCategoryButtons 

Комментарии

Нет комментариев
- Имя
- e-mail*
- Сайт
вы можете использовать теги [i],[b],[code],[quote]
Дополнительно