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

Думал, что уже врядли вернусь вновь к теме «Ribbon Controls в Delphi». Всё-таки восьми постов на эту тему по-моему вполне достаточно, чтобы усвоить основ работы с этими компонентами, а далее — дело техники и умение читать справку. Оказывалось, что мнение мое было ошибочным :). Но прежде, чем перейдем к тонкостям, я ещё раз напомню о том, какая информацию уже есть по теме работы с Ribbon Controls в этом блоге.

Статьи про Ribbon Controls

1. Компоненты Ribbon в Delphi. Возможности, проблемы, будущее. Первая статья из цикла. Здесь приводится самый простейший пример работы с Ribbon’ами, а также рассматриваются проблемы их использования с которыми я столкнулся. В заключение предполагается будущее использования Ribbon Controls в приложениях Delphi (мое предсказание оказалось неверным — многие глюки так и не были устранены).
2. Ribbon Controls шаг за шагом. Шаг 1 – визуальная разработка интерфейса. В статье рассматривается визуальная разработка будущего приложения, использующего Ribbon Controls. Минимум кода Delphi, максимум работы с мышкой. Эдакое мышевозное программирование для всех и каждого. В общем статья как раз для новичков в программировании.
3. Ribbon Controls шаг за шагом. Шаг 2 – дополнительные элементы интерфейса. Рассматриваются такие моменты работы с компонентами как:

  • создание split-кнопок,
  • создание галерей элементов,
  • работа с главным и popup-меню приложения и т.д.

В статье приводятся необходимые настройки свойств компонентов и небольшие листинги программного кода Delphi для закрепления материала.
4. Ribbon Controls шаг за шагом. Шаг 3 – работа со ScreenTips. Одной из отличных возможностей компонентов Ribbon Controls является использование информативных и красочных подсказок для пользователей, которые заменяют стандартные hints. Рассматривается вопрос о том, как эти подсказки правильно настроить и показать пользователю в нужное время в нужном месте.
5. Ribbon Controls шаг за шагом. Шаг 4 – создаем уникальный стиль или как работать в RibbonSkins. Не хватает трех стандартных тем оформления своего приложения, которое использует Ribbon Controls? Тогда эта статья для Вас. В статье рассматривается пример создания собственного скина для Ribbon. В статье не приводится пример рисования скина — я не художник и не спец. в PhotoShop.
6. Ribbon Controls в Delphi. Работа без мыши. При работе с Ribbon Controls часто могу возникать непонятные ошибки при их настройке в Design Time. В статье даются рекомендации по работе с Ribbon Controls без использования «мышевозного» стиля программирования, т.е. без мышки вообще. Статья рассчитана как минимум на тех читателей, которые знают, что представляет из себя компонент ActionManager.
7. Ribbon Controls в Delphi. Создаем элементы управления “на лету”. Статья о том как можно создавать новые элементы управления Ribbon Controls прямо по ходу работы программы. Будет полезна для тех, кто создает в Delphi что-то по-крупнее Блокнота.
8. Ribbon Controls в RAD Studio 2009-2010 и их глюки. Ribbon Controls, несмотря на свой красивый внешний вид, являются достаточно «сырыми» компонентами в Delphi. И разобраться с ними каждому желающему в настоящее время не под силу. Поэтому в статье даются рекомендации и пожелания по использованию Ribbon в своих приложениях, а также альтернативный вариант того как украсить свое приложение без использования риббонов в принципе.

«Тонкости» работы с Ribbon Controls

На самом деле никаких тонкосте нет в принципе :) Все что требуется от разработчика — это внимательность в работе с компонентами и (совсем немного) — знаний по работе с ActionManager’ом. Рассмотрим несколько простых примеров того, когда невнимательность порождает целый шквал однотипных вопросов на формумах.

Пример №1. Графика в Ribbon Controls.

Наверное, этот вопрос самый «больной» для всех кто впервые сталкивается с Ribbon Controls. То «зазубринки» какие-то проявляются, то картинка вместо прозрачного имеет чёрный, или ещё хуже, белый фон и т.д. Давайте разберемся глюк ли это компонентов или невнимательность?
Во-первых, заходим на msdn.com и задаем до безобразия простой запрос «ribbon images». Открываем первую же найденную статью и видим небольшую табличку в которой чёрным по белому показано то, сколько DPI должна иметь картинка в зивисимости от её линейных размеров. Например, для картинок 32х32 pixels картинка должна быть не менее 96 dpi. Далее под таблицей первый абзац говорит примерно следующее (пардон за мой вольный перевод):

Ribbon масштабирует изображения по мере необходимости, однако при масштабировании могут проявляться нежелательные эффекты. При разработке необходимо предусмотреть максимальное количество одних и тех же изображений с различными размерами и dpi. Если необходимое изображение не найдено, то находится ближайшее и увеличивается либо уменьшается.

Вывод из всего вышесказанного:
1. Следуйте тем рекомендациям, которые даются на msdn.com и снизите вероятность того, что получите «зазубринку» или что-то ещё.
2. Тщательно подбирайте размеры и dpi картинок.
Теперь, когда информация с MSDN получена проверим как эти рекомендации работают в Delphi 2010. Создаем новый проект с Ribbon Controls. Создаем главное меню приложения (как это делать — см. список статей выше), кидаем на форму ImageList для картинок. В ImageList будем держати картинки 32х32 пикселя.
Теперь пробуем загрузить в ImageList картинку в формате png с параметрами, которые нам рекомендует masdn, т.е. 32×32 96 dpi. У меня получилось следующее:

Может по этому поводу разносятся крики о том, что Ribbon не умеет работать с прозрачными png? Так Ribbon Controls здесь не при чем! Мы его даже не касались. Следовательно «проблема» в ImageList. Смотрим в его настройки и видим неприметное такое свойство «Color Depth»:

Может проблема в глубине цвета картинки? Проверим. Меняем глубину цвета на 32 бита и снова загружаем ту же картику в ImageList. Смотрим результат:

Разница на лицо. Теперь создаем в Action Manager’e новый Action, присваиваем ему вновь загруженное изображение, перетаскиваем Action в главное меню и смотрим результат в запущенном Delphi-приложении:

Где хоть одна зазабрина на картинке или непрозрачный фон? Я лично таковых не вижу, т.к. соблюдал все рекомендации msdn, а также правильно настроил компонент Delphi.
Отсюда опять же простой вывод — нет у Ribbon Controls явных глюков с png. Я не утверждаю, что глюков вообще нет, но в приведенном выше примере всё прекрасно видно.

Компонент Ribbon ComboBox — «лишняя» приблуда. Можно обойтись стандартным

Тоже достаточно спорный момент. Было дело, когда я и сам так считал, пока не прочитал туже докуменацию на msdn и help delphi. На самом деле этот компонент далеко не лишний в более-менее серьезных проектах.
Во-первых, стоит отметить, что контролов Ribbon не так уж и много в Delphi 2010, чтобы что-то было лишним.
Во-вторых, этот компонент был создан не только для «массовки», но и для того, чтобы обеспечить максимальное соответствие технологии Fluent UI. Хотя бы даже в плане внешнего вида.
Рассмотрим такой пример. Создадам две группы Ribbon на ленте. На первую поместим обычный ComboBox, а на вторую RibbonComboBox…Предложение получилось прям как в рекламе про стиральный порошок :).
Получим, на первый взгляд, практически идентичный вид панелей. Разве что «родной» Ribbon ComboBox 100% вписывается в оформление, а стандартный торчит как бельмо:

Вот различие номер раз — совместимость с темой оформления.
Двигаемся дальше. Добавим в каждый из комбобоксов, скажем..по 20 элементов. Запустите приложение и Вы убедитесь, что есть ещё одно отличие.
Стандартный ComboBox покажет в списке ровно столько элементов, сколько определено в его свойстве DropDownCount, а риббоновский — все, так как у него такого свойства просто нет.
Однако это совсем не значит, что RibbonComboBox полное УГ (унылое говно) и размер его списка определяется только количеством элементов в нем. Помните я вначале статьи говорил, что приступая к разработке с помощью Ribbon Controls надо хотя бы чуть-чуть понимать работу с ActionManager? Вот тут-то Ваши знания и нужны. Дело в том, что при установке нового контрола на ленту Delphi устанавливает его в контейнер (TActionClients[x]) никак не из вредности. Так как выделить контейнер мышкой подчас яавляется делом ювелирной точности и недюжего терпения (что тут говорить — этот косяк в риббонах был всё время), то показываю как выглядит TActionClients в окне Structure:

Выбираем контейнер, содержащий RibbonComboBox и внимательно смотрим в его свойства:

Самый простой спосооб узнать, что за свойства выделены на рисунке — это попробовать их ихменить. Например, изменив свойсво width вы измените размер контейнера целиком, а изменив свойство LabelWidth — измените только размер подписи и т.д. Но главное для нас сейчас — это свойство AllowResize, которое, применительно к RibbonComboBox, указывает какие линейные размеры списка мы позволяем изменить в run-time. Установим это свойство в grBoth. Запускаем приложение, раскрываем наш RibbonComboBox и видим у списка новую «фишечку»:

Меняйте теперь размеры листа хоть вдоль хоть поперек. А у стандартного ComboBox вы такого свойства в контейнере не найдете. Вот и совместимость с интерфейсом типа MS Office 2007.

Подобных примеров можно привести бесконечное множество и все они будут касаться подобных мелочей в работе на которые, казалось бы, и внимания то обращать не стоит. Но по своему, пусть и не большому, опыту в програмировании могу сказать — документация — это сила. Подчас я и сам могу допускать такие дикие «ляпы» в программах, на которые потом смотришь и думаешь «чё я курил, когда это делал?», но что поделать? Я простой самоучка, который доходит до всего через чтение документации, книг, блогов программистов и, конечно же на собственном опыте. И Вам, самоучки, того же желаю — читайте :).

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
3 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
vitek_tlt
vitek_tlt
11/07/2010 16:43

Клааассс….Спасибо

Алексей Тимохин

Спасибо!