Menu

При запуске меню появляется сообщение о синтаксической ошибке

Проблема
Создаю меню в дизайнере меню. Но при запуске меню на исполнение появляется сообщение о синтаксической ошибке. Если его проигнорировать, то дальнейшая работа происходит без ошибок.

Причина

Проблема связана с некорректной интерпретацией русских букв в качестве "горячих клавиш" в основной линейке меню.

"Горячая клавиша" - это клавиша или набор клавиш, нажатие на которые вызывает выполнение соответствующего пункта меню без необходимости выбора его мышкой.

Дело в том, что если, для пункта в основной линейке меню явно не указана "горячая клавиша", то по умолчанию, штатным генератором меню в качестве "горячей клавиши" назначается комбинация клавиши 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.

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

О других способах решения данной проблемы можно почитать здесь

Устранение сообщения о синтаксической ошибке при запуске меню

Как добавить в меню список открытых окон

Вопрос

Как добавить в меню список всех открытых окон

Ответ

  • В главной линейке меню создаем пункт "Окна"
  • В этом пункте меню нажимаем кнопку в столбце "Options"
  • В открывшемся окне вводим Pad Name = _msm_windo
  • У пункта меню "Окна", оставляем столбец "Result" в значении "SubMenu" и нажимаем кнопку "Edit" для создания подменю
  • Необходимо создать в подменю хотя бы один пункт. Например, пункт "Следующее окно", в разделе Result = #Bar, а в качестве значения _MWI_ROTAT
  • Теперь выбираем пункт основного меню FoxPro с именем View, подпункт Menu Options
  • Вводим значение Name = _MWINDOW

    Все. Теперь в раскрывающемся меню "Окна" будет отображаться список ВСЕХ созданных окон. Даже если это окно не отображается на экране (скрыто).

    Для проверки, дайте в командном окне команду

    DEFINE WINDOW test FROM 0,0 to 10,10

    Окно не активно. Только создано. Тем не менее, уже отображается в списке окон пункта Window. Более того, на него можно переключиться!

    Следует помнить, что при редактировании меню в дизайнере, имя выпадающего Popup-меню автоматически устанавливается равным имени PAD-пункта из которого оно собственно "выпадает". Это значит, что если по каким-либо причинам Вы измените название PAD-пункта. Например, вместо "Окна" напишите "Окно", то имя POPUP-меню автоматически измениться на "Окно". Надо будет не забыть, снова исправить его на _MWINDOW

    Если Вас не устраивает отображение вообще всех открытых окон, то в этом случае Вам придется самостоятельно вести этот список и формировать выпадающее меню динамически.

Почему в готовом EXE не работает копирование по Ctrl+C, Ctrl+V

Проблема

На этапе разработки приложения работало копирование через буфер обмена (горячие клавиши Ctrl+C, Ctrl+V), но в готовом файле EXE эти комбинации клавиш не работают. Как можно исправить эту ситуацию?

Причина

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

Решение

Вам необходимо определить соответствующие пункты меню. Это все те пункты, которые определены в выпадающем меню для пункта системного меню Edit. Обычно этот пункт делается вторым пунктом основной линейки меню. Т.е. в Вашем файле для запуска основного меню должно быть примерно следующий код.

  
 * Первый пункт основной линейки меню  
  DEFINE PAD _msm_edit OF _MSYSMENU PROMPT "Правка" COLOR SCHEME 3  
 * Прочие пункты основной линейки меню  
    
  DEFINE POPUP _medit MARGIN RELATIVE SHADOW COLOR SCHEME 4  
  DEFINE BAR _MED_UNDO OF _medit PROMPT "Отменить" ;  
  	KEY CTRL+Z, "CTRL+Z"  
  DEFINE BAR _MED_REDO OF _medit PROMPT "Вернуть" ;  
  	KEY CTRL+R, "CTRL+R"  
  DEFINE BAR _MED_SP100 OF _medit PROMPT "\-"  
  DEFINE BAR _MED_CUT OF _medit PROMPT "Вырезать" ;  
  	KEY CTRL+X, "CTRL+X"  
  DEFINE BAR _MED_COPY OF _medit PROMPT "Копировать" ;  
  	KEY CTRL+C, "CTRL+C"  
  DEFINE BAR _MED_PASTE OF _medit PROMPT "Вставить" ;  
  	KEY CTRL+V, "CTRL+V"  
  DEFINE BAR _MED_CLEAR OF _medit PROMPT "Очистить"  
  DEFINE BAR _MED_SP200 OF _medit PROMPT "\-"  
  DEFINE BAR _MED_SLCTA OF _medit PROMPT "Выделить все" ;  
  	KEY CTRL+A, "CTRL+A"

Если Вы делаете свое меню, используя, дизайнер меню, то

  • Присвоение имени "_msm_edit" производится в окне, которое появляется при нажатии кнопки в столбце "Options" напротив пункта меню "Правка"
  • Для присвоения имени выпадающего Popup-меню "_medit" в дизайнере меню войдите в подменю "Правка". Далее выберите пункт системного меню View, подпункт Menu Options и в графе Name впишите значение "_medit" (без кавычек, разумеется)
  • Для присвоения имен BAR-пунктам выберите в столбце Result дизайнера меню значение "Bar #" и впишите соответствующие имена в столбце для ввода команд
  • Комбинации горячих клавиш назначаются в окне, которое появляется при нажатии кнопки в столбце "Options" напротив соответствующего Bar-пункта меню

    Следует заметить, что для функционирования комбинаций горячих клавиш вовсе не обязательно активировать ранее определенное меню. Достаточно самого факта его определения.

    Впрочем, я бы рекомендовал все-таки его сделать, поскольку сам Pad-пункт главной линейки меню "_msm_edit" - это хорошая "привязка" для динамического добавления "контекстного" меню. Т.е. такого пункта меню, которое появляется только при активации определенных форм.

Как изменить шрифт пунктов меню в дизайнере меню

Вопрос:

Как изменить шрифт пунктов меню в дизайнере меню?

Ответ:

Непосредственно в дизайнере меню такого пункта нет.

Вероятно, причина в том, что настройки основной линейки меню берутся из системных настроек (из настроек Windows). Т.е. даже если Вы явно укажите свой шрифт для пунктов основной линейки меню, то они будут проигнорированы. Вот разработчики FoxPro и посчитали, что нет смысла вводить настройку, которая все равно игнорируется в основной линейке меню.

Однако для всех прочих пунктов меню все-таки можно явно указать шрифт.

Дело в том, что, то, что формируется в дизайнере меню - это не окончательное меню, а лишь некий "макет" меню. Из этого макета впоследствии формируется окончательное меню, когда Вы выбираете пункт системного меню Menu - Generate. Эта генерация выполняется несколько формально. Чем, в данном случае, и следует воспользоваться.

Выберите нужный Вам пункт меню (исключая пункт основной линейки меню) и нажмите кнопку в столбце "Options".

В разделе SKIP FOR напишите примерно следующее:

.F. FONT "Arial Cyr",20 STYLE "B"

После генерации меню получим в итоговом файле MPR что-то вроде

  
  DEFINE BAR 1 OF пример PROMPT "Пример" ;  
  SKIP FOR .F. "Arial Cyr",20 STYLE "B"

В режиме Preview в самом дизайнере меню Вы не увидите результатов этого "хакерского" трюка. Результат будет виден только при запуске самого меню.

Если по каким-либо причинам, Вы не хотите использовать раздел SKIP FOR для указания шрифта, то примерно, то же самое можно сделать в разделе Message. Только там код будет несколько другим

'' FONT "Arial Cyr",20 STYLE "B"

После генерации меню получим в итоговом файле MPR что-то вроде

  
  DEFINE BAR 1 OF пример PROMPT "Пример" ;  
  MESSAGE '' "Arial Cyr",20 STYLE "B"

Разумеется, для задания шрифта следует использовать только один раздел. Т.е. либо раздел SKIP FOR, либо раздел Message. Не надо указывать шрифт в обоих разделах. Это вызовет синтаксическую ошибку в итоговом меню. Будет одновременно две опции FONT у одного пункта.

Замечание:

Начиная с версии Visual FoxPro 9, в синтаксисе команды DEFINE BAR у опции FONT появился третий необязательный параметр - nFontCharSet. Т.е. можно сделать шрифт меню относительно независимым от региональных настроек системы. Например, для русского языка в разделе SKIP FOR это будет выглядеть примерно так:

.F. FONT "Arial",20,204 STYLE "B"

Более того, генератор меню версии Visual FoxPro 9 стал более "интеллектуальным". Если у него получается конструкция вида SKIP FOR .F., то она просто исключается, и меню будет иметь следующий вид

  
  DEFINE BAR 1 OF пример PROMPT "Пример" ;  
  "Arial",20,204 STYLE "B"
В готовом EXE все меню или его часть отображается не по русски

Проблема

При переносе готового приложения на машину клиента все меню или его часть отображается не по русски или непонятными закорючками.

Причина

Причин данной проблемы может быть несколько. Но наиболее вероятная - это изменение тем рабочего стола. Точнее, не был указан вообще, или указан какой-либо специфический шрифт для отображения меню.

Решение

Установите корректный шрифт меню для используемой темы рабочего стола. Обычно это шрифт Tahoma, 8. Или просто установите какую-либо стандартную тему рабочего стола со шрифтами по умолчанию.

К сожалению, решить данную проблему программно (т.е. явно указать шрифт для меню) можно лишь частично. Можно задать шрифт для выпадающих пунктов меню, но основная линейка меню использует только и исключительно системные настройки. Как это можно сделать посмотрите здесь

Как изменить шрифт пунктов меню в дизайнере меню

//////////////// ///////////////
Авторизация
*
*
Генерация пароля