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

时间:2021-12-16 19:44:47

问题:将 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:= to TFmxObject(c).ChildrenCount - 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 - downto 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 = then
Exit;
end; ..... 省略 ...... end;