Проблема
Создаю меню в дизайнере меню. Но при запуске меню на исполнение появляется сообщение о синтаксической ошибке. Если его проигнорировать, то дальнейшая работа происходит без ошибок.
Причина
Проблема связана с некорректной интерпретацией русских букв в качестве "горячих клавиш" в основной линейке меню.
"Горячая клавиша" - это клавиша или набор клавиш, нажатие на которые вызывает выполнение соответствующего пункта меню без необходимости выбора его мышкой.
Дело в том, что если, для пункта в основной линейке меню явно не указана "горячая клавиша", то по умолчанию, штатным генератором меню в качестве "горячей клавиши" назначается комбинация клавиши Alt и первого символа названия пункта меню. Как правило, это русская буква. В результате, генератор меню создает команду вида
DEFINE PAD _1h610hbkn OF _MSYSMENU PROMPT "Пример" COLOR SCHEME 3 ; KEY ALT+П, ""
Вот в момент выполнения подобной команды и возникает сообщение о синтаксической ошибке на фрагменте "KEY ALT+П". Игнорирование этой ошибки приводит к тому, что на данный пункт меню просто не назначается горячая клавиша. Хотя сам пункт меню успешно создается.
Решение
Решение заключается в том, чтобы для всех пунктов основной линейки меню принудительно назначать горячие клавиши. Например, русской букве "П" соответствует латинская буква "G" (одна и та же клавиша). Вот и следует назначить для PAD-пункта "Пример" горячую клавишу "Alt+G".
Правда, возможно и другое решение.
За генерацию меню отвечает специальная программа Genmenu.prg Ее можно отредактировать, для того, чтобы подавить автоматическую генерацию горячих клавиш, если они не были заданы явно. Для этого вызываете данную программу на редактирование:
MODIFY COMMAND (Home()+"genmenu.prg")
За добавление горячих клавиш отвечает функция AddKey. Перейдите к этой функции на команду
FUNCTION addkey
и закомментируйте в этой функции весь условный оператор, начинающийся с фразы:
IF !IsLeadByte(prompt)
Однако оставьте не закомментированной в нем единственную строчку
STORE "" to m.cKeyname
Т.е. соответствующий кусок программы должен выглядеть так:
*!* IF !IsLeadByte(prompt) *!* STORE c_key_padhotkey_LOC + UPPER(LEFT(prompt,1)) TO m.cKeyname *!* ELSE STORE "" to m.cKeyname *!* ENDIF
Сохраните и откомпилируйте измененный файл GenMenu.prg.
Все. Теперь Вам остается только повторить генерацию всех ранее созданных меню. Сообщение о синтаксической ошибке больше возникать не будут.
О других способах решения данной проблемы можно почитать здесь
Устранение сообщения о синтаксической ошибке при запуске меню