found the bug in TToolBar (Delphi6-XE4)

Today I found the bug in CheckMenuDropdown method for standard TToolBar component. If you’ll assign to toolbar the mainmenu and one from item will have a lot of subitems (some are visible) then the position of dropdown menu will be incorrect (above of toolbar).
The reason of bug is the next code:

      if (GetSystemMetrics(SM_CYMENU) * FTempMenu.Items.Count) + APoint.Y >
         Screen.MonitorFromPoint(APoint).Height then
        Dec(APoint.Y, Button.Height);

As you see, the FTempMenu.Items.Count will return the counf of all subitems (including hidden).
The correct code:

      if (GetSystemMetrics(SM_CYMENU) * GetVisibleMenuItemCount()) + APoint.Y >
         Screen.MonitorFromPoint(APoint).Height then
        Dec(APoint.Y, Button.Height);

where GetVisibleMenuItemCount function is

  function GetVisibleMenuItemCount: Integer;
  var
    i: Integer;
  begin
    Result := 0;
    for i := 0 to FTempMenu.Items.Count-1 do
      if FTempMenu.Items[i].Visible then
        Inc(Result)
  end;

Unfortunatelly there is no way to override the CheckMenuDropdown method to fix this issue because all used variables (FTempMenu, FCaptureChangeCancels etc). So only one way is to patch the ComCtrls.pas unit.
This bug confirmed in all versions from Delphi 6 to XE4.

Tags:

Leave a Reply

You must be logged in to post a comment.