修复 XE7 , XE8 Frame 内 PopupMenu 快捷键失效问题

问题:将 Frame 含 PopupMenu 放置 Form 后,在 Frame 里的 PopupMenu 失效,无法按快捷键。

适用:(XE7 update 1 / XE8) for Windows 平台

修正方法:

请将源码 FMX.Forms.pas 复制到自己的工程目录里,再进行修改。

找到 TCommonCustomForm.KeyDown 函数,修改如下:

procedure TCommonCustomForm.KeyDown(var Key: Word; var KeyChar: System.WideChar; Shift: TShiftState);

..... 省略 ......

{+++>}
  // 遍历所有的 Menu
  function FindMenu(c: TFmxObject): TFmxObject;
  var i: Integer;
  begin
       if c is TFmxObject then
          for i:=0 to TFmxObject(c).ChildrenCount - 1 do
          begin
               if TFmxObject(c).Children[i] is TMainMenu then
                  TMainMenu(TFmxObject(c).Children[i]).DialogKey(Key, Shift)
               else if TFmxObject(c).Children[i] is TPopupMenu then
                  TPopupMenu(TFmxObject(c).Children[i]).DialogKey(Key, Shift);
               FindMenu(TFmxObject(c).Children[i]);
          end;
  end;
{<+++}

var
  Control: IControl;
begin

..... 省略 ......

      // 3. perform key in other Menus
      for I := ChildrenCount - 1 downto 0 do
        if Children[i] <> FocusPopup then
        begin

{+++>}    FindMenu(Children[I]); // 加入这行:遍歷所有的 Menu

          if Children[I] is TMainMenu then
            TMainMenu(Children[I]).DialogKey(Key, Shift)
          else if Children[I] is TPopupMenu then
            TPopupMenu(Children[I]).DialogKey(Key, Shift);
          if Key = 0 then
            Exit;
        end;

..... 省略 ......

end;

 

posted @ 2015-03-21 11:57  龟山Aone  阅读(970)  评论(0编辑  收藏  举报