Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы отображения "Zehnertastatur" в программе на Delphi

Delphi , Компоненты и Классы , Меню

При разработке приложений на Delphi 10.4.2 Win32 VCL может возникнуть проблема с отображением описания горячих клавиш для меню. В частности, при программном установлении сочетаний клавиш для элементов меню, некоторые из них могут не отображаться корректно, особенно если используется клавиша VK_NUMPAD0, соответствующая цифровой клавиатуре.

Описание проблемы

В приложении Delphi на Windows 10 x64 (немецкий язык) были установлены сочетания клавиш для некоторых элементов меню:

mRasterizedDoubleSize.Shortcut := VK_ADD;
mRasterizedHalveSize.Shortcut := VK_SUBTRACT;
mRasterizedResetToOriginalSVGSize.Shortcut := VK_NUMPAD0;

Однако, в результате, для третьего меню элемента, которому было присвоено сочетание VK_NUMPAD0, описание "Zehnertastatur" (цифровая клавиатура) не отображалось.

Подтвержденное решение

Для решения данной проблемы можно использовать следующий подход:

  1. Создать TActionList и привязать к нему элементы меню.
  2. Определить действие aResetZoom с описанием 'Reset zoom'#9'Numpad 0' без установленного сочетания клавиш.
  3. Не выводить данное действие на главный меню, а создать отдельное действие aResetZoomShortcut с тем же обработчиком и сочетанием клавиш Num 0, которое не будет отображаться на меню.
  4. Использовать функцию 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;
  1. Использовать MyGetSpecialName для получения описания сочетания клавиш в текущем системном языке и добавления его к описанию элемента меню:
mRasterizedResetToOriginalSVGSize.Caption := mRasterizedResetToOriginalSVGSize.Caption + #9 + MyGetSpecialName(ShortCut(VK_NUMPAD0, [])) + ' ';

Альтернативный ответ

Также можно использовать 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Меню ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 16:00:30/0.0053999423980713/1