В приложении Win32 VCL Delphi 10.4.2 в Windows10 X64 (немецкий язык) я программно установил ярлыки для некоторых пунктов меню:
mRasterizedDoubleSize.Shortcut := VK_ADD;
mRasterizedHalveSize.Shortcut := VK_SUBTRACT;
mRasterizedResetToOriginalSVGSize.Shortcut := VK_NUMPAD0;
Это приводит к следующему меню во время выполнения:
(ZEHNERTASTATUR на немецком языке означает ЦИФРОВАЯ КЛАВИАТУРА)
Почему Zehnertastatur (цифровая клавиатура) не отображается для третьего пункта меню?
Как я могу отобразить ZEHNERTASTATUR (ЦИФРОВУЮ КЛАВИАТУРУ) для ярлыка пункта меню, назначенного с помощью VK_NUMPAD0
?
Я отправил отчет о качестве для этой ошибки в Vcl.Menus: https://quality.embarcadero.com/browse/RSP-33296 Проголосуйте за него!
РЕДАКТИРОВАТЬ: я попробовал совет Андреаса, но он работает только программно во время выполнения, а не во время разработки в инспекторе объектов:
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));
РЕДАКТИРОВАТЬ 3: теперь я отлаживал Vcl.Menus
: ошибка, похоже, находится в Vcl.Menus.ShortCutToText
: хотя VK_ADD
(6 млрд долларов) правильно переведен 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'
. - person Andreas Rejbrand   schedule 10.03.2021TActionList
может помочь, заключается в том, что вы можете использовать вторичное средство быстрого доступа.) - person Andreas Rejbrand   schedule 10.03.2021actNumpad0Dummy.Shortcut := VK_NUMPAD0;
(конечно, для свойства Ation этого пункта меню установлено значениеactNumpad0Dummy
) не работает. Он показывает тот же результат, что и раньше. - person user1580348   schedule 10.03.2021TActionList
сTAction
с именемaResetZoom
сCaption = 'Original SVG size'#9'Numpad 0'
и NOShortcut
. Это вы разместите в главном меню. Затем, чтобы заставить работать фактическое сокращение клавиатуры, вы можете либо использоватьaResetZoom.SecondaryShortcuts
, либо создать фиктивное действие сShortcut = VK_NUMPAD0
и тем жеOnExecute
(которое вы не помещаете в главное меню). - person Andreas Rejbrand   schedule 10.03.2021