如何解决如何为分配有“VK_NUMPAD0”的菜单项快捷方式显示“NUMERIC KEYPAD”?
在 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) 由 {{ 正确翻译1}},GetSpecialName(ShortCut)
($60) 不是由 VK_NUMPAD0
翻译的!
EDIT4:我找到了解决方案:
GetSpecialName(ShortCut)
解决方法
一种方法是这样的:
使用 TActionList
。这通常是一种很好的做法。在此列表中定义您的操作,然后将它们简单地映射到菜单项、按钮、复选框等。操作列表工具是 VCL 恕我直言的最佳部分之一。
现在,使用 aResetZoom
和 NO Caption = 'Reset zoom'#9'Numpad 0'
创建一个名为 ShortCut
的操作。把它放在菜单栏上。
然后,创建一个名为 aResetZoomShortcut
的 new 操作,其具有相同的 OnExecute
(也可能是相同的 OnUpdate
)和快捷方式 Num 0
(设置在设计时或在运行时以编程方式)。不要把它放在主菜单上。
结果:
当我按下小键盘 0(而不是 alpha 0)时会触发操作。
这种方法有很多变体。也许您可以使用一个没有 ShortCut
但在其 SecondaryShortCuts
列表中使用 Num 0 的单个操作使其工作。或者,您可以使用表单的 KeyPreview
和 OnKeyPress
属性代替“虚拟”操作。
多种选择。选择最适合您的特定场景的一种。
赠言
请注意,完全有可能在设计时使用对象检查器设置带有标签的标题。见example video。
您或许可以使用 Win32 GetKeyNameText
函数进行本地化。以下代码改编自 VCL:
var
name: array[0..128] of Char;
begin
FillChar(name,SizeOf(name),0);
GetKeyNameText(MapVirtualKey(VK_NUMPAD0,0) shl 16,@name[0],Length(name));
// string(name) now is 'NUM 0' on my system
话虽如此,我个人并不介意快捷方式描述是非本地化的还是手动本地化的——就像应用程序的其余部分一样。
更新
关于如何使用本地化代码的说明:
procedure TForm5.FormCreate(Sender: TObject);
var
name: array[0..128] of Char;
NameAsANormalString: string;
begin
FillChar(name,Length(name));
NameAsANormalString := name;
ShowMessage(name);
end;
生产
在我的系统上。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。