Пишу я программу с мультиязыковым интерфейсом. Пунктам главного меню по ходу выполнения программы могут присваиваться новые значения Caption. После смены языка с английского на русский перестают работать Alt-акселераторы (которые в меню подчеркнутыми буквами обозначены).
Я задаю акселераторы для пунктов меню только через Caption пункта с помощью амперсанда, например "&Файл", "&Правка" и т.д. вместо старых "&File", "&Edit" ...
Что еще нужно сделать, чтобы новые акселераторы заработали?
Re: Акселераторы TMainMenu не работают после смены Caption-о
Здравствуйте, Tack, Вы писали:
T>Пишу я программу с мультиязыковым интерфейсом. Пунктам главного меню по ходу выполнения программы могут присваиваться новые значения Caption. После смены языка с английского на русский перестают работать Alt-акселераторы (которые в меню подчеркнутыми буквами обозначены).
T>Я задаю акселераторы для пунктов меню только через Caption пункта с помощью амперсанда, например "&Файл", "&Правка" и т.д. вместо старых "&File", "&Edit" ...
T>Что еще нужно сделать, чтобы новые акселераторы заработали?
Может забываем переключить раскладку на русскую?
Re[2]: Акселераторы TMainMenu не работают после смены Captio
Здравствуйте, Vodyamba, Вы писали:
V>Может забываем переключить раскладку на русскую?
Нет, такого мы не забываем. Проверьте! Сделайте проект с TMainMenu, введите туда пару английских названий пунктов меню с акселераторами, а потом замените из программы все заголовки пунктов на русские аналоги.
Я думал, дело в переменной ValidHotKeys — ничего подобного. Может, надо пересоздавать пункты меню заново с новыми заголовками?
Re[3]: Акселераторы TMainMenu не работают после смены Captio
Здравствуйте, Tack, Вы писали:
T>Нет, такого мы не забываем. Проверьте! Сделайте проект с TMainMenu, введите туда пару английских названий пунктов меню с акселераторами, а потом замените из программы все заголовки пунктов на русские аналоги.
Проверил — все превосходно работатет.
Акселераторы для русских названий будут работать только в русской раскладке, а для английских, соответственно, в английской.
Re[4]: Акселераторы TMainMenu не работают после смены Captio
У меня отрисовка пунктов идет по OnAdvancedDrawItem. Каким боком это может влиять на акселераторы? Я уже отключил эту функцию, оставил только OwnerDraw = True. Та же проблема.
Отключаешь OwnerDraw — все работает прекрасно!
В чем может быть дело?
Re[5]: Акселераторы TMainMenu не работают после смены Captio
Здравствуйте, Tack, Вы писали:
>У меня отрисовка пунктов идет по OnAdvancedDrawItem. Каким боком это может влиять на акселераторы? Я уже отключил эту функцию, оставил только OwnerDraw = True. Та же проблема. T>Отключаешь OwnerDraw — все работает прекрасно!
Может стоит посмотреть в VCL, что делается в оригинале при отрисовке пункта меню?
Re[6]: Акселераторы TMainMenu не работают после смены Captio
Здравствуйте, fetis, Вы писали:
F>Может стоит посмотреть в VCL, что делается в оригинале при отрисовке пункта меню?
Да я бы с радостью! Но нету у меня сорсов! Delphi 7 пиратская, без исходников VCL...
К тому же может кто уже на форуме сталкивался, так побыстрее было бы.
Re: Акселераторы TMainMenu не работают после смены Caption-о
Здравствуйте, Tack, Вы писали:
T>Я задаю акселераторы для пунктов меню только через Caption пункта с помощью амперсанда, например "&Файл", "&Правка" и т.д. вместо старых "&File", "&Edit" ...
Проблему действительно если раскапывать — то по VCL. Пиратская версия без исходников — весьма странный вариант, никогда такого не видел
Вопрос скорее в том, нужно ли это раскапывать. Пункты меню стоит задавать через Action-ы, у которых есть свои shortcut-ы.
Re[7]: Акселераторы TMainMenu не работают после смены Captio
Здравствуйте, Tack, Вы писали:
T>Здравствуйте, fetis, Вы писали:
F>>Может стоит посмотреть в VCL, что делается в оригинале при отрисовке пункта меню?
T>Да я бы с радостью! Но нету у меня сорсов! Delphi 7 пиратская, без исходников VCL... T>К тому же может кто уже на форуме сталкивался, так побыстрее было бы.
Посмотрел я в код. Решения твоей проблемы без исходников нету. Разве что перехватывать Menu месаги самому на форме и обрабатывать их как надо.
Вся проблема в том что при OwnerDraw VCL Menu обрабатывает кнопки само но не совсем корректно. Есть в Forms.pas функция IsAccel, так вот она сравнивает символы с разными регистрами не используя твоих языковых настроек
function IsAccel(VK: Word; const Str: string): Boolean;
begin
Result := CompareText(Char(VK), GetHotKey(Str)) = 0;
end;
Еее нужно поменять на
function IsAccel(VK: Word; const Str: string): Boolean;
begin
Result := AnsiCompareText(Char(VK), GetHotKey(Str)) = 0;
end;
Дуругими словами, что бы нажать на меню &Файл небе нужно, кроме то что переключится на русскую расскладку, так еще и Caps-Lock нажать (поднять регистр)
Что бы все заработало тебе необходимо переписать Forms.pas в директорию твоего проэкта и изменить соответствующую функцию.