I managed finally to reproduce the problem in Delphi XE (Update 1) on Win7 64 with Aero enabled. It seems that the size gets set wrong in the .DFM file, and because the Ribbon
doesn't support manual resizing you can't visually fix it in the IDE (although it appears correctly at runtime) or in the Object Inspector
. It occasionally appears correctly at runtime, but it seems that's sporadic as well.
It's a nasty bug, because it makes it impossible to design the Ribbon
. You can add RibbonGroup
items, and assign the ActionManager
, and try and design it completely using the Structure Pane
, but of course that's not a practical solution.
Fortunately, there's a pretty easy workaround, although it's annoying to have to do. :)
I managed twice to get the following workaround to function, but starting over it failed to work several times, so it's a possible way around it (no promises - worked in XE, consistently failed in XE2 Update 2):
- Right-click on the
Ribbon
and add at least one tab.
- Right click on the form in the IDE, and choose
View as Text
from the context (pop-up) menu.
- Find the
Ribbon
control in the .dfm
text, and change the Height
from the 26
that the IDE assigned to 200
. (The next step will adjust it, but that's fine - the 200
fixes the immediate problem.)
- Right-click again, and choose
View as Form
, and the Ribbon
should display correctly.
(I reported it in QC against XE2 Update 2, as the problem also exists there - QC #101642)
I traced it to TCustomRibbon.GetCaptionHeight
, specifically
FCaptionHeight := Max(GetSystemMetrics(SM_CYCAPTION), 26);
It seems like the GetSystemMetrics
call is returning something less than 26
on certain Win7 configurations (although I can't figure out why yet). There are a couple of commented lines in that method that seem to alter the result, but as I said they've been commented out.
The strange part is that in the TCustomRibbon.Create
, the Height
is set by a call to GetRibbonMetric(rmFullHeight)
, which sets the Result := cRibbonHeight + GetCaptionHeight;
, and cRibbonHeight
is a constant defined as cRibbonHeight = 117;
.
Finally think I've tracked this down. In the declaration of TRibbon
, there's a published
property declaration:
published
...
property Height default TCustomRibbon.cRibbonHeight;
Because this is the default, it appears that any other value means that the call to GetRibbonMetric
mentioned above doesn't happen (see the TCustomRibbon.Create
mentioned above), and the strange result from the call to GetSystemMetric
causes the erroneous value 26
to be saved as the 'other value`. Wierd; will update the QC in the AM.
Addendum: Updated QC report with additional details.
Addendum: QC report opened in May 2012, but does not appear to have been resolved as of XE5 Update 1 (checked Jan 2014).