уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Буквально на днях столкнулся с такой задачкой, касательно Ribbon Controls: Есть форма с Ribbon’ом, на ленте расположена, как обычно, вкладка, на вкладке группа, а в группе, помимо других контролов, RibbonComboBox. Требуется в зависимости от некоторых действий пользователя добавить в этот список элемент, элемент должен располагаться именно как действие Action, а не обычный Item:string. Соответственно для всех вновь добавленных элементов должен быть назначен обработчик OnExecute.

В целом, задачка достаточно простая, но, думаю, что тем, кто только знакомится с Ribbon Controls будет полезно узнать как добавить новый элемент в RibbonCombobox в runtime.

Как работать со списком RibbonCombobox в design-time, используя мышь и встроенные редакторы, Вы всегда можете узнать, посмотрев соответствующую главу справочника по компонентам Ribbon в Delphi. В принципе, прочитав её станет понятно, чем новый визуальный компонент RibbonComboBox выгодно отличается от стандартного при размещении на ленте.

В runtime задачка несколько усложняется тем, что нам необходимо добраться до коллекции Items у RibbonCombobox “вслепую” да ещё и добавить обработчик на OnExecute.

Давайте создадим простенькое приложение как показано на рисунке:

Ribbon

Ничего лишнего – только наш “подопытный” компонент и ActionManager без которого, как известно, при работе с лентами – никуда.

Теперь обратим наше внимание на то, как располагается компонент RibbonComboBox в окне Structure:

Ribbon_2

Как видите, всё опять же завязано на ActionManager’e:

  • ActionBars содержит коллекцию вкладок ленты Ribbon (ActionBars)
  • Каждый элемент вкладки (ActionBar) содержит произвольное количество элементов (Items)
  • Каждый элемент в группе может также иметь произвольное количество элементов уже в своей коллекции Items.

Всё, что нам надо – добраться до последней коллекции и создать там новый элемент.

Понимаю, что для тех, кто сегодня впервые в жизни встретил такую “странную” конструкцию коллекций, задача может показаться достаточной сложной. Однако это не сложнее, чем скачать прикольные картинки на свой комп, используя Synapse.

Напишем такой обработчик OnCreate у главной формы:

procedure TForm1.FormCreate(Sender: TObject);
begin
   with ActionManager1.ActionBars[0].Items[0].ActionClients[0].Items.Add do
    begin
      Action:=TAction.Create(self);
      TAction(Action).Caption:='Заголовок действия';
      Action.Category:='Категория';
      Caption:='Наш первый элемент'
    end;
end;

Можете запустить приложение и убедиться, что в RibbonCombobox содержится неактивный элемент с текстом «Наш первый элемент». Рассмотрим подробнее, что мы сделали:

ActionManager1.ActionBars[0] – добрались до группы RibbonGroup1 на которой лежит список.

ActionManager1.ActionBars[0].Items[0] – получили доступ к коллекции контролов, расположенных в группе и, в частности, доступ к контейнеру с RibbonComboBox

И, наконец, получили доступ к коллекции Items у RibbonComboBox и воспользовались методом Add для добавления в коллекцию нового элемента.

Далее мы создали для нового элемента действие (Action), которое поместили в категорию “Категория” (в принципе, могли бы обойтись спокойно и без этого – Action был бы доступен в списке всех действие у ActionManager’а).

Теперь переходим ко второй части нашей задачи – пишем обработчик OnExecute. Пусть наш обработчик, в зависимости от того какой элемент выбран в списке выводит определенное сообщение. Создаем в разделе private главной формы такую процедуру:

procedure TForm1.MySuperAction(Sender: TObject);
const S = 'Выбран элемент из группы %d и свойством Caption "%s"';
begin
  ShowMessage(Format(S,[TAction(Sender).GroupIndex,
                       TAction(Sender).Caption]));
end;

Теперь добавляем в обработчик OnCreate всего одну строку:

procedure TForm1.FormCreate(Sender: TObject);
begin
   with ActionManager1.ActionBars[0].Items[0].ActionClients[0].Items.Add do
    begin
      ...
      Action.OnExecute:=MySuperAction;
      ...
    end;
end;

Запускаем программу и радуемся — при выборе элемента в списке выдается сообщение, содержащее индекс группы в которой содержится Action и заголовок Action’a.

По-моему не так уж и сложно, если немного разобраться с межанизмом Actions ;)

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
2 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
uHBa
uHBa
22/06/2011 15:57

Добрый день, плохо ориентируюсь на сайте и времени в обрез, так что спрошу тут. Все примеры работы с Action’ами в рантайме даны с позиции «абсолютного рантайма», т.е. считается что и сам Action и его обработчик назначается во время выполнения. У меня ситуация несколько иная и всвязи с этим возникла проблема. Подскажите пожалуйста, как добавить на RibbonGroup уже созданные в дизайнтайме Action’ы? Причём задача осложняется тем, что просто добавить целиком ActionBar НЕ ВАРИАНТ. Нужно именно добавлять по одному два Action’а из различных категорий ActionList’а на один RibbonGroup. Прошу прощения за сумбурное изложение. Заранее благодарен за ответ. [code]ActionManager1.ActionBars[0].ActionBar := MyRibbonGroup;[/code] — не… Подробнее »

alex
10/08/2011 18:34

Давно пользуюсь DevExpress — отличная библиотека и рибоны есть. Всем советую!