【发布时间】:2021-06-08 07:33:15
【问题描述】:
在一个 Delphi 10.4.2 Win32 VCL 应用程序中,在 Windows10 X64(德语)上,我以编程方式设置了一些菜单项的快捷方式:
mRasterizedDoubleSize.Shortcut := VK_ADD;
mRasterizedHalveSize.Shortcut := VK_SUBTRACT;
mRasterizedResetToOriginalSVGSize.Shortcut := VK_NUMPAD0;
这会在运行时产生以下菜单:
(“ZEHNERTASTATUR”是德语数字键盘)
为什么第三个菜单项没有显示“Zehnertastatur”(数字键盘)?
如何为分配有VK_NUMPAD0 的菜单项快捷方式显示“ZEHNERTASTATUR”(数字键盘)?
我已在 Vcl.Menus 中针对此错误提交了质量报告:https://quality.embarcadero.com/browse/RSP-33296 请投票!
编辑:我已经尝试过 Andreas 的建议,但它只能在运行时以编程方式工作,而不是在对象检查器中的设计时工作:
mRasterizedResetToOriginalSVGSize.Caption := mRasterizedResetToOriginalSVGSize.Caption + #9 + '0 (NUMPAD) ';
难道没有在运行时将单词“NUMPAD”翻译成当前系统语言的函数吗?
EDIT2:我试过这个来获取VK_NUMPAD0 快捷方式的单词,但它只返回相同的“0”而没有“NUMPAD”后缀:
var s: TShortCut;
s := ShortCut(VK_NUMPAD0, []);
CodeSite.Send('TformMain.FormCreate: ShortCutToText(s)', ShortCutToText(s));
EDIT3:我现在已经调试了Vcl.Menus:错误似乎在Vcl.Menus.ShortCutToText:而VK_ADD($6B)被GetSpecialName(ShortCut)正确翻译,VK_NUMPAD0( $60) 没有被GetSpecialName(ShortCut)翻译!
EDIT4:我找到了解决方案:
function MyGetSpecialName(ShortCut: TShortCut): string;
var
ScanCode: Integer;
KeyName: array[0..255] of Char;
begin
Result := '';
ScanCode := Winapi.Windows.MapVirtualKey(LoByte(Word(ShortCut)), 0) shl 16;
if ScanCode <> 0 then
begin
if Winapi.Windows.GetKeyNameText(ScanCode, KeyName, Length(KeyName)) <> 0 then
Result := KeyName;
end;
end;
var s: System.Classes.TShortCut;
s := ShortCut(VK_NUMPAD0, []);
CodeSite.Send('ShortCutToText', MyGetSpecialName(s));
【问题讨论】:
-
可以使用
TActionList并将菜单项连接到它吗?或者至少通过TMenuItem.ShortCut属性以外的其他方式实现快捷方式?因为无论如何,你都可以做到mRasterizedResetToOriginalSVGSize.Caption := 'Original SVG size'#9'Numpad 0'。 -
(
TActionList有帮助的原因是您可以使用辅助快捷方式。) -
不幸的是,
actNumpad0Dummy.Shortcut := VK_NUMPAD0;(当然已经将菜单项的 Ation 属性设置为actNumpad0Dummy)不起作用。它显示的结果与之前相同。 -
我的想法是你使用
TActionList和TAction命名为aResetZoom和Caption = 'Original SVG size'#9'Numpad 0'和 NOShortcut。这个放在主菜单上。然后要让实际的键盘快捷方式起作用,您可以使用aResetZoom.SecondaryShortcuts或使用Shortcut = VK_NUMPAD0和相同的OnExecute(您不要放在主菜单上)创建一个虚拟操作。 -
请看我的问题编辑:难道没有一个函数可以在运行时将单词“NUMPAD”翻译成当前系统语言吗?
标签: delphi keyboard-shortcuts menuitem delphi-10.4-sydney