Мне наконец удалось воспроизвести проблему в Delphi XE (обновление 1) на Win7 64 с включенной Aero. Кажется, что в файле .DFM задан неправильный размер, и поскольку Ribbon
не поддерживает ручное изменение размера, вы не можете визуально исправить его в IDE (хотя он отображается правильно во время выполнения) или в Object Inspector
. Иногда он отображается корректно во время выполнения, но, кажется, это также спорадично.
Это неприятная ошибка, потому что это делает невозможным проектирование Ribbon
. Вы можете добавить RibbonGroup
элементов и назначить ActionManager
, а также попытаться создать его полностью, используя Structure Pane
, но, конечно, это не практичное решение.
К счастью, есть довольно простой обходной путь, хотя это раздражает. :)
Мне дважды удавалось заставить работать следующий обходной путь, но запуск через него несколько раз не удался, поэтому возможен обходной путь (без обещаний - работал в XE, последовательно проваливался в XE2 Update 2):
- Щелкните правой кнопкой мыши на
Ribbon
и добавьте хотя бы одну вкладку.
- Щелкните правой кнопкой мыши форму в IDE и выберите
View as Text
в контекстном (всплывающем) меню.
- Найдите элемент управления
Ribbon
в тексте .dfm
и измените Height
с 26
, который IDE присвоил 200
. (Следующий шаг настроит его, но это нормально - 200
устраняет непосредственную проблему.)
- Снова щелкните правой кнопкой мыши и выберите
View as Form
, и Ribbon
должно отобразиться правильно.
(я сообщал об этом в QC против XE2 Update 2, так как там также существует проблема - QC # 101642 )
Я проследил это до TCustomRibbon.GetCaptionHeight
, в частности
FCaptionHeight := Max(GetSystemMetrics(SM_CYCAPTION), 26);
Кажется, что вызов GetSystemMetrics
возвращает что-то меньшее 26
в некоторых конфигурациях Win7 (хотя я пока не могу понять, почему). В этом методе есть пара закомментированных строк, которые, кажется, изменяют результат, но, как я уже сказал, они были закомментированы.
Странная часть в том, что в TCustomRibbon.Create
, Height
устанавливается с помощью вызова GetRibbonMetric(rmFullHeight)
, который устанавливает Result := cRibbonHeight + GetCaptionHeight;
, а cRibbonHeight
является константой, определенной как cRibbonHeight = 117;
.
Наконец-то, думаю, я это отследил. В объявлении TRibbon
есть объявление свойства published
:
published
...
property Height default TCustomRibbon.cRibbonHeight;
Поскольку это значение по умолчанию, похоже, что любое другое значение означает, что вызов GetRibbonMetric
, упомянутый выше, не происходит (см. TCustomRibbon.Create
, упомянутый выше), и странный результат от вызова GetSystemMetric
приводит к тому, что ошибочное значение 26
сохраняется как «другое значение». Wierd; обновит КК в АМ.
Приложение: Обновлен отчет о контроле качества с дополнительной информацией.
Приложение: отчет о контроле качества открыто в мае 2012 года, но, по-видимому, не было разрешено по состоянию на XE5 Обновление 1 (проверено в январе 2014 года).