Акселераторы TMainMenu не работают после смены Caption-ов
От: Tack  
Дата: 03.04.05 10:07
Оценка:
Пишу я программу с мультиязыковым интерфейсом. Пунктам главного меню по ходу выполнения программы могут присваиваться новые значения Caption. После смены языка с английского на русский перестают работать Alt-акселераторы (которые в меню подчеркнутыми буквами обозначены).

Я задаю акселераторы для пунктов меню только через Caption пункта с помощью амперсанда, например "&Файл", "&Правка" и т.д. вместо старых "&File", "&Edit" ...

Что еще нужно сделать, чтобы новые акселераторы заработали?
Re: Акселераторы TMainMenu не работают после смены Caption-о
От: Vodyamba Россия  
Дата: 03.04.05 11:18
Оценка:
Здравствуйте, Tack, Вы писали:

T>Пишу я программу с мультиязыковым интерфейсом. Пунктам главного меню по ходу выполнения программы могут присваиваться новые значения Caption. После смены языка с английского на русский перестают работать Alt-акселераторы (которые в меню подчеркнутыми буквами обозначены).


T>Я задаю акселераторы для пунктов меню только через Caption пункта с помощью амперсанда, например "&Файл", "&Правка" и т.д. вместо старых "&File", "&Edit" ...


T>Что еще нужно сделать, чтобы новые акселераторы заработали?


Может забываем переключить раскладку на русскую?
Re[2]: Акселераторы TMainMenu не работают после смены Captio
От: Tack  
Дата: 03.04.05 12:12
Оценка:
Здравствуйте, Vodyamba, Вы писали:

V>Может забываем переключить раскладку на русскую?


Нет, такого мы не забываем. Проверьте! Сделайте проект с TMainMenu, введите туда пару английских названий пунктов меню с акселераторами, а потом замените из программы все заголовки пунктов на русские аналоги.
Я думал, дело в переменной ValidHotKeys — ничего подобного. Может, надо пересоздавать пункты меню заново с новыми заголовками?
Re[3]: Акселераторы TMainMenu не работают после смены Captio
От: fetis  
Дата: 04.04.05 08:06
Оценка:
Здравствуйте, Tack, Вы писали:

T>Нет, такого мы не забываем. Проверьте! Сделайте проект с TMainMenu, введите туда пару английских названий пунктов меню с акселераторами, а потом замените из программы все заголовки пунктов на русские аналоги.


Проверил — все превосходно работатет.
Акселераторы для русских названий будут работать только в русской раскладке, а для английских, соответственно, в английской.
Re[4]: Акселераторы TMainMenu не работают после смены Captio
От: Tack  
Дата: 04.04.05 12:13
Оценка:
Здравствуйте, fetis, Вы писали:

F>Проверил — все превосходно работатет.


Извиняюсь, забыл добавить
MainMenu1.OwnerDraw := True;

У меня отрисовка пунктов идет по OnAdvancedDrawItem. Каким боком это может влиять на акселераторы? Я уже отключил эту функцию, оставил только OwnerDraw = True. Та же проблема.
Отключаешь OwnerDraw — все работает прекрасно!

В чем может быть дело?
Re[5]: Акселераторы TMainMenu не работают после смены Captio
От: fetis  
Дата: 04.04.05 12:39
Оценка:
Здравствуйте, Tack, Вы писали:

>У меня отрисовка пунктов идет по OnAdvancedDrawItem. Каким боком это может влиять на акселераторы? Я уже отключил эту функцию, оставил только OwnerDraw = True. Та же проблема.

T>Отключаешь OwnerDraw — все работает прекрасно!

Может стоит посмотреть в VCL, что делается в оригинале при отрисовке пункта меню?
Re[6]: Акселераторы TMainMenu не работают после смены Captio
От: Tack  
Дата: 04.04.05 12:50
Оценка:
Здравствуйте, fetis, Вы писали:

F>Может стоит посмотреть в VCL, что делается в оригинале при отрисовке пункта меню?


Да я бы с радостью! Но нету у меня сорсов! Delphi 7 пиратская, без исходников VCL...
К тому же может кто уже на форуме сталкивался, так побыстрее было бы.
Re: Акселераторы TMainMenu не работают после смены Caption-о
От: Softwarer http://softwarer.ru
Дата: 04.04.05 13:29
Оценка:
Здравствуйте, Tack, Вы писали:

T>Я задаю акселераторы для пунктов меню только через Caption пункта с помощью амперсанда, например "&Файл", "&Правка" и т.д. вместо старых "&File", "&Edit" ...


Проблему действительно если раскапывать — то по VCL. Пиратская версия без исходников — весьма странный вариант, никогда такого не видел

Вопрос скорее в том, нужно ли это раскапывать. Пункты меню стоит задавать через Action-ы, у которых есть свои shortcut-ы.
Re[7]: Акселераторы TMainMenu не работают после смены Captio
От: Danchik Украина  
Дата: 04.04.05 13:31
Оценка: 51 (1)
Здравствуйте, 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 в директорию твоего проэкта и изменить соответствующую функцию.

Удачи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.