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

Итак, справочник по Ribbon Controls качается, а вопросы растут прямо-таки в геометрической прогрессии :). Что ж, позволю себе ещё раз напомнить Вам, что первая часть справочника была рассчитана именно на знакомство с Ribbon Controls и никоим образом не затрагивает решений проблем, возникающих в работе с этими компонентами в Delphi 2009-XE. Все решения проблем, особенности, внутренности Ribbon Controls планируется вынести во вторую часть, написание которой займет, видимо, намного больше времени, т.к. вопросов много, проблем тоже, а решения иногда закопаны достаточно глубоко, чтобы так вот за 5 секунд в них разобраться. Однако, радует то, что среди множества вопросов, посупивших за последнее время, большинство оказываются «ложными срабатываниями», т.е. ответ есть либо есть в справочнике и достаточно скачать документ и просмотреть, либо настолько, пардон, глуп, что письма идут парами типа «Есть вопрос» и тут же «Сорри, тупанул» :). Однако мы сегодня не о справочнике, а о решении двух проблем с Ribbon Controls в Delphi.

Проблема №1.
При помещении стандартного контрола на RibbonGroup выскакивает сообщение:

Описание проблемы. Сия «трудноразрешимая» проблема является следствием того, что разработчик почему-то палагает, что Ribbon Controls это нечто невообразимо мощное, что само собой управляется и контролируется. И все Action’ы () — это порождение тьмы Ribbon’а. С чего ради? Получается, что ActionManager на форму кладется просто так до кучи? Вообще-то он и служит для создания и работы с элементами управления, а Ribbon (может прозвучит и не совсем корректно) — это простая «шкура», скин, панелька в конце концов, на которой лежат красивые кнопки, чекбоксы и т.д. И максимум, что делает Ribbon — краcиво их «рисует». И то, что ActionManager при работе с Ribbon Controls автоматом регистрирует новые тулбары, ещё не значит, что ActionManager умеет возникать из неоткуда, когда вы пробуете создать ActionClientItem для несуществующего контейнера. Отсюда и решение «проблемы»:
Взять за правило вначале на форму бросать ActionManager, а уже потом всё остальное. И проблема исчезнет сама собой!
Но эта «проблема» собственно и не проблема…так…мелочи, которые некоторые никак не хотят изучить. Надеюсь этот ответ — поможет. К пдобным же «проблемам» можно отнести и желание раздуть меню риббона или како-либо его части на непомерное число пикселей в длину и ширину. В плане извращения («издевательство» как-то уж слишком мягко) интерфейса на Ribbon Controls больших надежд возлагать не стоит, т.к. практически все основные размеры элементов жёстко забиты в модули в виде констант. Опять же прежде, чем приступать к таким действиям, стоит зайти на msdn.com и почитать, что же там пишут такого про использоавание Ribbon.

Проблема №2.
При использовании кнопок (CommandStyle = csButton), имеющим малый размер (ButtonSize = btSplit) и объединенных в одну группу (Action’ы в ActionManager имеют одно и то же значение свойства GroupIndex отличное от нуля) элементы никак не хотят «отжиматься» и вообще ведут себя неадекватно.
В отличие от прерыдущей — эта проблема, которая, к сожалению существует. Впервые мне на эту проблему указал Михаил в своем комментарии к статье. За что ему большое спасибо — коллекция материалов для нового справочника пополнилась ещё одним пунктиком :).

Итак, что наталкивает на мысль, что это ошибка? Конечно же пример приложения, воспроизводящего эту проблему, которое Михаил мне и прислал по почте.

Кстати, другим вопрошающим на заметку — хотите скорого решения проблемы — подкрепляйте свои выводы о «глюках» примерами в виде скринов, а лучше виде Delphi-проектов, иначе вопрос очень сильно рискует остаться без ответа.

Приложение элементарно и воспроизводится за пару минут — бросайте на главную форму ActionManager, Ribbon, создаете в ActionManager 3 действия (Action)? присвоив им одно и то же значение свойства GroupIndex и укладываете их на RibbonGroup не меняя никаких свойств у ActionClientItem, т.е. оставив свойства CommandStyle = csButton и ButtonSize = btSplit.
Запускаем приложение и, по логике вещей, должны получить следующее: жмем Action1 — он «залипает» и свойство Checked становится равным True, у остальных Action’ов — напротив Checked становятся в False и они должны «отжаться».
На деле всё не совсем так — Action’ы «залипают» все сразу и выглядят в приложении, как имеющие свойство Checked=True. Получается как-то так:

На рисунке нажатым должен быть Action2.

Другой момент описаной выше проблемки заключается в том, что когда мы меняем свойство ButtonSize на btLarge — все работает как надо. А по сути ничего не меняется — выполняются теже операции, требуется то же поведение.
Надеялся, что этот «феномен маленьких кнопок» исправлен в Delphi XE — запустил все свои рабочие ноутбуки, коих 2 и на обоих разные версии Delphi (2009 и 2010), рабочий комп с триалкой Delphi XE проверил — проблема осталась, начиная с 2009 версии.

В глубины проблемы пока лезть не стал, т.к. работы сейчас валом, но небольшое решение всё-таки обнаружил. Для мелких кнопок, объединенных в группу можно использовать в обработчике OnExecute вот такой метод:

RibbonGroup1.RecreateControls

В результате все элементы управления в группе будут пересозданы, причём с ожидаемым состоянием, а не со значениями свойств по дефолту.
Как появится более менее больше времени на изучение Ribbon Controls — постараюсь более тщательно разобраться с этим моментом и, может удасться найти более касивое решение, но загадывать пока не буду…мало ли.

Если у Вас есть, что сказать по приведенной выше проблеме — высказывайте свои мнения. возможные решения и т.д. Также, если Вы сталкиваетесь при работе с Ribbon Controls в Delphi с жими непонятными ситуациями — присылайте приложения, демнстрируеющие «глюк» с описанием проблемы — это будет Ваш вклад в развитие справочника по Ribbon Controls.

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
7 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
cleaner
cleaner
10/10/2010 12:33

А у меня следующая проблема — после выполнения любого Action-а из ActionManager (D2010) возникает ошибка доступа к памяти
Access violation at address 021C757F in module ‘___.OCX’. Read of address 00000258.
Честно говоря, пренеприятнейший глюк:(

cleaner
cleaner
13/10/2010 11:05

Вечером сделаю пустой проект и выложу сюда с примером. Ошибка возникает, даже если в модуле процедуры имеется только комментарий. Возможно, проблема в том, что я начал использовать Ribbon в ActiveX (а вдруг они не дружат:)

cleaner
cleaner
13/10/2010 11:47

Кстати, интересный момент — попытка перейти к тому адресу, по которому зафиксирована ошибка (Program Pause; Goto Address) ни к чему не приводит. Вроде как, ошибка сторонней dll, а не программы…

cleaner
cleaner
15/10/2010 04:43

Влад, выслал вам писььмо с проектом, так как не понял, каким образом можно выложить проект на блоге

cleaner
cleaner
15/10/2010 17:15

Спасибо:)

MsDos
MsDos
22/11/2010 20:25

Здравствуйте. Можете помочь? Такая вот проблема:
В Ribbon требуется использовать галерею произвольного размера.
В принцепи тут проблем нет, но есть две заковырки.
1) как сделать так, чтобы часть изображений были видны (как допустим в в Стилях Ms Word)
т.е. видны на самой Group`е а не при нажатии на соотв. кнопочку.
2) как сделать так, чтобы отображались скролы с кнопкой при нажатие на которую будет показана вся галерея (как в техже Стилях Ms Word или в фигурах Ms Paint (в Win7))

если болие точно, то нужен такой-же эффект как в MsPaint.
Заранее спасибо.