При разработке приложений на Delphi 10.4.2 Win32 VCL может возникнуть проблема с отображением описания горячих клавиш для меню. В частности, при программном установлении сочетаний клавиш для элементов меню, некоторые из них могут не отображаться корректно, особенно если используется клавиша VK_NUMPAD0, соответствующая цифровой клавиатуре.
Описание проблемы
В приложении Delphi на Windows 10 x64 (немецкий язык) были установлены сочетания клавиш для некоторых элементов меню:
Однако, в результате, для третьего меню элемента, которому было присвоено сочетание VK_NUMPAD0, описание "Zehnertastatur" (цифровая клавиатура) не отображалось.
Подтвержденное решение
Для решения данной проблемы можно использовать следующий подход:
Создать TActionList и привязать к нему элементы меню.
Определить действие aResetZoom с описанием 'Reset zoom'#9'Numpad 0' без установленного сочетания клавиш.
Не выводить данное действие на главный меню, а создать отдельное действие aResetZoomShortcut с тем же обработчиком и сочетанием клавиш Num 0, которое не будет отображаться на меню.
Использовать функцию MyGetSpecialName, которая переводит название клавиши в текущий системный язык:
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;
Использовать MyGetSpecialName для получения описания сочетания клавиш в текущем системном языке и добавления его к описанию элемента меню:
Также можно использовать TActionList с SecondaryShortCuts или KeyPreview и OnKeyPress свойства формы для реализации сочетания клавиш без отображения их в меню.
Комментарии
При использовании TActionList и Caption с табами, описание сочетания клавиш может не переводиться на другие языки.
Локализацию можно реализовать с помощью функции GetKeyNameText, которая возвращает описание клавиши в текущем системном языке.
Пример кода с локализацией
procedure TForm5.FormCreate(Sender: TObject);
var
name: array[0..128] of Char;
begin
FillChar(name, SizeOf(name), 0);
GetKeyNameText(MapVirtualKey(VK_NUMPAD0, 0) shl 16, @name[0], Length(name));
// Теперь переменная name содержит описание клавиши в текущем системном языке
end;
Этот подход позволит корректно отображать описание сочетаний клавиш для элементов меню в приложениях на Delphi, использующих VCL.
заключается в некорректном отображении описания горячих клавиш для элементов меню в приложении Delphi, использующем клавишу `VK_NUMPAD0`, особенно на системах с немецким языком.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.