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

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

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

修正方法:

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

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

TCommonCustomForm.KeyDown( Key: Word; ..... 省略 ......

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

<span style="color: #0000ff;">var<span style="color: #000000;">
Control: IControl;
<span style="color: #0000ff;">begin<span style="color: #000000;">

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

  </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 3. perform key in other Menus</span>
  <span style="color: #0000ff;"&gt;for</span> I := ChildrenCount - <span style="color: #800080;"&gt;1</span> <span style="color: #0000ff;"&gt;downto</span> <span style="color: #800080;"&gt;0</span> <span style="color: #0000ff;"&gt;do</span>
    <span style="color: #0000ff;"&gt;if</span> Children[i] <> FocusPopup <span style="color: #0000ff;"&gt;then</span>
    <span style="color: #0000ff;"&gt;begin</span>

<span style="color: #008000;">{<span style="color: #008000;">+++><span style="color: #008000;">} FindMenu(Children[I]); <span style="color: #008000;">//<span style="color: #008000;"> 加入这行:遍歷所有的 Menu

      <span style="color: #0000ff;"&gt;if</span> Children[I] <span style="color: #0000ff;"&gt;is</span> TMainMenu <span style="color: #0000ff;"&gt;then</span><span style="color: #000000;"&gt;
        TMainMenu(Children[I]).DialogKey(Key,Shift)
      </span><span style="color: #0000ff;"&gt;else</span> <span style="color: #0000ff;"&gt;if</span> Children[I] <span style="color: #0000ff;"&gt;is</span> TPopupMenu <span style="color: #0000ff;"&gt;then</span><span style="color: #000000;"&gt;
        TPopupMenu(Children[I]).DialogKey(Key,Shift);
      </span><span style="color: #0000ff;"&gt;if</span> Key = <span style="color: #800080;"&gt;0</span> <span style="color: #0000ff;"&gt;then</span><span style="color: #000000;"&gt;
        Exit;
    </span><span style="color: #0000ff;"&gt;end</span><span style="color: #000000;"&gt;;

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

<span style="color: #0000ff;">end;

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...