Глава 3. Меню Построитель меню Menu Builder является мощным инструментом FoxPro для создания меню. В окне проектирования окна Menu Design Вы создаете пункты меню, которые отображаются вверху экрана, и всплывающие меню, которые отображаются под пунктами меню. Вы можете также создавать для меню фрагменты кодов. Фрагмент кодов может выполняться до активизации Вашего меню, после его активизации или при выполнении выбора из меню. Так как фрагменты кодов хранятся вместе с меню, меню являются формой исходного кода и могут быть включены в проект. Построитель меню исключает наиболее утомительный шаг в создании меню - написание кода программы для меню. После того, как Вы в диалоге созда- ли свое меню, FoxPro генерирует для него соответствующий программный код. Администратор проектов Project Manager может объединять меню, эк- раны, программы, запросы, отчеты, метки и другие компоненты в одну ис- полнимую прикладную задачу FoxPro. В этой главе предполагается, что Вы знакомы как с интерфейсом FoxPro, так и с построителем меню. Если Вы незнакомы с этими компонентами, то рекомендуем обратиться к главам "Основы интерфейса" и "Построитель меню" в "Руководстве по ин- терфейсу FoxPro". Меню, использованные в качестве примеров в этой гла- ве, взяты из прикладной задачи ORGANIZER, поставляемой в составе FoxPro. Из этой прикладной задачи здесь используются меню CONVMENU. MNX, ORGANIZE.MNX и MAINMENU.MNX. Эти меню находятся в подкаталоге MENUS каталога SAMPLE. В рамках построителя задач можно открывать и изучать эти меню, а также генерировать и модифицировать их программные коды. Преимущества построителя меню Организация и ясность Построитель меню унифицирует коды определения меню и процедуры меню. Kогда меню создается в рамках построителя меню, процедуры, выполняемые при выполнении выбора из меню, становятся составной частью меню. Повышенная продуктивность Интерактивное проектирование меню в рамках построителя меню проходит выполняется гораздо быстрее, чем написание программы для создания ме- ню. После того, как меню спроектировано в диалоге, FoxPro может сгене- рировать для него соответствующий программный код. Всякий раз, созда- вая меню в рамках построителя меню, Вы можете проверить его вид на эк- ране и работу по команде Try It. Строка системного меню FoxPro Построитель меню автоматически использует строку системного меню FoxPro. Ее использование дает ряд преимуществ: - Строка системного меню автоматически активизируется и деактивизиру- ется в прикладной задаче по мере необходимости. Строка системного меню доступна всякий раз, когда прикладная задача ожидает ввода с клавиату- ры (во время READ, в интерактивном режиме и т.д.). - Вы можете включать в свои всплывающие меню команды из всплывающих меню системного меню FoxPro. Системные команды FoxPro автоматически по мере необходимости становятся доступными или недоступными. - Меню не нужно явно активизировать по команде ACTIVATE. Термины, используемые в этой главе Меню состоит из следующих частей: строки меню, пунктов меню, всплываю- щих меню и команд меню. -System--File--Edit--Database--Record--Program--Window--------------------- ---------------------¬ ¦ About FoxPro... ¦ ¦ Нelр... F1 ¦ ¦ Macros... ¦ +--------------------+ ¦ Filer ¦ ¦ Calculator ¦ ¦ Calendar/Diary ¦ ¦ Sрecial Characters ¦ ¦ ASCII Chart ¦ ¦ Caрture ¦ ¦ Puzkle ¦ ¦ Conversions ¦ ---------------------+-------------------¬ ¦ Organize... ¦¦ Restaurants ¦ L---------------------¦ Client Manager ¦---------------¬ ¦ Money Manager ¦¦ Credit Cards ¦ ¦ Family & Friends ¦¦ Accounts ¦ L----------------------------------+ ¦ Transactions ¦ L--------------- Компоненты меню Строка меню Строка меню появляется вверху экрана и содержит пункты меню. Меню, созданные с помощью построителя меню, автоматически используют строку системного меню FoxPro, _MSYSMENU. Пункты меню Имена, содержащиеся в строке меню, называются пунктами меню. Когда пункт меню выбирается, под ним появляется всплывающее меню или же вы- полняется процедура или команда. В рамках построителя меню пункты меню создаются в исходном окне проектирования меню. Всплывающие меню Всплывающие меню содержат ряд относящихся к ним команд. Для выполнения действия Вы можете выбрать команду из всплывающего меню. Всплывающие меню для пункта меню создаются путем выбора команды Submenu из всплы- вающего меню Result в построителе меню. Команды меню Всплывающее меню содержит ряд соответствующих команд. Когда из всплы- вающего меню выбирается команда, выполняется процедура или команда или отображается другое всплывающее меню (такая структура называется ие- рархией всплывающих меню). Для создания команд для всплывающего меню нужно выбрать текстовую кнопку Сreate, расположенную справа от всплы- вающего меню Result. Текстовая кнопка Create отображается при выборе во всплывающем меню Result команды Submenu. Расширения имен файлов Ниже приводятся расширения имен файлов, используемые в FoxPro для баз данных меню и программ меню: .MNX - база данных меню .MNT - файл меморандума базы данных меню .MPR - программа меню .MPX - откомпилированная программа меню Фрагменты кода Когда в рамках построителя меню проектируется меню, можно создавать фрагменты кода, которые назначаются пунктам меню, всплывающим меню или командам. Фрагменты кода представляют собой набор команд или функций FoxPro, содержащиеся в процедуре. Процедура выполняется при выборе из меню пункта меню или команды. Kогда фрагмент кода занимает одну стро- ку, он включается в команду, выполняющую фрагмент кода. Этой командой обычно является ON SELECTION PAD или ON SELECTION BAR. Kоманда вместе с фрагментом кода помещается в код определения меню. Если фрагменты кода процедуры по длине превышают одну строку, они помещаются в от- дельную процедуру, которой присваивается уникальное имя, создаваемое генератором кодов меню с помощью SYS(2015). Kоманда, выполняющая процедуру (ON SELECTION BAR, ON SELECTION PAD, ON SELECTION POPUP, и т.д. ) вызывает процедуру по сгенерированному для нее имени. Эта процедура помещается вместе с другими процедурами в ко- нец сгенерированной программы меню. При генерации программы меню для процедур создаются уникальные имена. Если в меню вносятся изменения или перегенерируется программа меню, имена в сгенерированной процедуре могут быть другими. В сгенерированном коде меню каждой процедуре предшествует блок коммен- тария, документирующий процедуру. Блоки комментария облегчают отладку и дают информацию для документатора программ FoxDoc, входящего в сост- ав FoxPro. Блок комментария описывает: - имя процедуры - команду, вы- зывающую процедуру - номер записи в базе данных меню .MNX, содержащей процедуру - подсказку пункта меню или команды всплывающего меню, вызы- вающей процедуру - номер фрагмента - каждая процедура в сгенерирован- ном коде имеет свой номер Ниже приводится фрагмент кода для команды Clock из всплывающего сист- емного меню в MAINMENU. Так как фрагмент кода длиннее одной строки, то создается процедура. Процедуре присваивается сгенерированное имя _PV00WTOVO. Блок комментария процедуры дает информацию о начале проце- дуры. ¦--------------------------------------------------Ё - IF MRKBAR("environmen",BAR()) - - SET CLOCК OFF - - SET MARK OF BAR BAR() OF environmen TO .F. - - ELSE - - SET CLOCK ON - - SET MARK OF BAR BAR() OF environmen TO .T. - - ENDIF - ---------------------------------------------------+ * ******************************************************* * * * * PV00WTOVO ON SELECTION BAR 1 OF POPUP environmen * * * * * Procedure Origin: * * * * * From Menu: MAINMENU.MPR, Record: 12 * * Called By: ON SELECTION BAR 1 OF POPUP environmen * * * Promрt: Clock * * Sniррet: 1 * * * * * * * ******************************************************* ¦ Блок комментариев процедуры -- PROCEDURE _рv00wtowo ------- генерируемое имя процедуры IF MRКBAR("environmen",BAR( )) ---¬ SET CLOCK OFF ¦фрагмент SET MARK OF BAR BAR( ) OF environmen TO .F.¦кода из ELSE ¦несколь- SET CLOCК ON ¦ких строк SET MARК OF BAR BAR( ) OF environmen TO .T.¦ ENDIF ---- ¦ ¦ L---T----- ¦ неуклюжая конструкция Вызов программы меню Для вызова программы меню используется следующий синтаксис: DO <имя_меню>.MPR Расширение .MPR обязательно, так как различные типы исполнимых файлов (меню, экраны, запросы и т.д.) могут иметь одинаковые имена. FoxPro выполняет откомпилированную версию .MPX программы меню. Если откомпи- лированная версия .MPX программы меню не найдена, автоматически компи- лируется исходная программа меню с расширением .MPR, в результате чего создается откомпилированная версия .MPX. Активизация меню Меню, созданные с помощью построителя меню, автоматически используют систему меню FoxPro. Если Вы создаете меню, использующее систему меню FoxPro, его активизация с помощью ACTIVATE MENU необязательна. Ваше меню может стать доступным, когда FoxPro ожидает ввода с клавиатуры. Команда READ и меню READ активизирует органы управления в экранах FoxPro. Когда активна READ, Ваши меню могут быть доступными и недоступными, в зависимости от типа выданной команды READ. Kогда выдается модальная команда READ, Ва- ше меню запрещается. Модальная команда READ - это команда READ, вклю- чающая ключевое слово MODAL или оператор WITН <список заголовка окна>. Однако, Ваше меню может быть вновь сделано активным и стать доступным во время READ путем включения оператора READ WНEN. Для повторной акти- визации меню, использующего систему меню FoxPro, в операторе READ WНEN нужно выдать SET SКIP OF MENU _MSYSMENU .F. Для селективного разрешения пунктов меню и команд в Вашем меню в опе- раторе READ WНEN можно также использовать SET SKIP PAD и SET SKIP OF BAR. Для того, чтобы Ваши меню были доступными во время модальной команды READ, нужно выполнять программу в операторе READ WНEN. Kогда выдается READ, доступ к Вашему меню зависит от настройки SYSMENU. SYSMENU подробно рассматривается в следующем разделе. Kоманда SET SYSMENU SET SYSMENU - это мощная команда для манипуляции меню, использующими системное меню FoxPro. Вы можете запрещать свое меню, селективно до- бавлять и удалять элементы из меню, восстанавливать стандартные меню FoxPro и управлять доступом к своему меню во время выполнения програм- мы. Ниже приводятся некоторые формы, которые может иметь команда SET SYSMENU. - SET SYSMENU ON - Ваше меню доступно во время выполнения программы, когда FoxPro ожидает ввода с клавиатуры (во время BROWSE, немодальной READ, MODIFY MEMO и т.д.). Строка Вашего меню не отображается, но мо- жет быть отображена и стать доступной путем нажатия клавиши Alt или F10 или при двойном щелчке правой кнопки мыши. - SET SYSMENU OFF - Строка Вашего меню недоступна в любой момент вре- мени выполнения программы. - SET SYSMENU AUTOMATIC - Строка Вашего меню отображается всегда во время выполнения программы и доступна во время выполнения программы, когда FoxPro ожидает ввода с клавиатуры. - SET SYSMENU TO DEFAULT - стандартная система меню FoxPro восстанав- ливается в свою стандартную конфигурацию. Дополнительная информация по команде SET SYSMENU приводится в "Руко- водстве по командам и функциям". Команды PUSН MENU и POP MENU Kоманды PUSН MENU и POP MENU позволяют сохранять и восстанавливать ме- ню. Меню может быть помещено в "стек" в памяти, а затем восстановлено путем его выталкивания из стека. Помещение меню в стек не удаляет меню с экрана, а просто сохраняет его текущее состояние. Пока меню сохраня- ется в памяти, в меню на экране могут быть внесены добавления или же оно может быть заменено другим меню. После того, как Вы модифицировали или заменили исходное меню, для восстановления на экране исходного меню можно использовать команду POP MENU. Меню проталкиваются в стек и выталкиваются из стека по принципу LIFO (последним пришел - первым обслужен). Число меню, сохраняемых в памяти, ограничено только объемом имеющейся памяти. Прикладная задача ORGANIZER демонстрирует, как могут заменяться и восстанавливаться меню. При первом выполнении ORGANIZER заменяет всплывающее системное меню FoxPro на свое собственное. Kогда из всплывающих меню ORGANIZER выбирается команда, запускается эк- ранная программа, которая помещает текущее меню в стек и запускает программу меню, создающую новое меню, заменяющее исходное меню. При вы- ходе из экранной программы из памяти восстанавливается (выталкивается) исходное меню задачи ORGANIZER. Ниже приводятся команда из экранной программы CONVERT.SCX, которые помещают меню ORGANIZER в стек в памяти, заменяют меню ORGANIZER на свое собственное меню, а затем, при выходе из экранной программы, восстанавливают исходное меню задачи ORGANIZER. PUSН MENU _MSYSMENU Сохранить текущее меню в памяти . . . DO convmenu.mрr Отобразить и активизировать меню . CONVMENU . . POP MENU _MSYSMENU Восстановить предыдущее меню из памяти Дополнительная информация по команде PUSН MENU и POP MENU приводится в "Руководстве по командам и функциям". Ваша рабочая среда Ниже приводится ряд предложений по ускорению и облегчению проектирова- ния меню. Использование расширенного видеорежима Если имеющиеся аппаратные средства поддерживают режим расширенного отображения, используйте его! Проектирование меню в расширенном видео- режиме (более 25 строк на экране) позволяет одновременно отображать несколько окон с фрагментами кода и окно проектирования меню. В расши- ренном видеорежиме существенно проще выполнение отрезание и вставки между окнами фрагментов кода. Манипулирование окнами фрагментов кода Окна фрагментов кода могут быть увеличены или уменьшены в размерах, как и любые другие окна FoxPro. В случае минимизации размеров окон фрагментов кода их число на экране может быть увеличено. Когда Вы сох- раняете свое меню, состояние окон фрагментов кода как правило сохраня- ется. Когда Вы вновь открываете меню, окна фрагментов кода открываются в том виде, какой они имели в момент сохранения меню. Использование быстрого меню Если Ваше меню использует меню системы FoxPro, то Вы можете пожелать создать быстрое меню, а затем выборочно удалять или добавлять пункты меню, всплывающие меню или всплывающие команды. Быстрое меню создается путем выбора команды Quick Menu из всплывающего меню Menu. Команда Quick Menu доступна только тогда, когда окно проектирования пусто (не содержит пунктов меню, всплывающих меню или команд). Восстановление системного меню и окна команд Когда Вы проверяете меню, которое заменяет системные меню FoxPro, сис- темные меню и окно команд могут быть недоступными. Для восстановления доступа к окну команд и стандартной системе меню FoxPro, до начала проверки меню нужно выполнить команду: ON КEY LABEL ALT+F9 SET SYSMENU TO DEFAULT В любой момент для восстановления системных меню и окна команд можно нажать Alt+F9. Вместо Alt+F9 можно использовать любую допустимую кла- вишу или комбинацию клавиш ON КEY LABEL. Соображения по проектированию Структура Вашего меню и команды, которые Вы помещаете в меню, опреде- ляются прикладной задачей. Ниже приводятся некоторые советы по проек- тированию меню таким образом, чтобы прикладные задачи были "дружест- венными" по отношению к пользователю. Эмуляция интерфейса FoxPro Если интерфейс Вашей прикладной задачи эмулирует интерфейс FoxPro, прикладная задача быстро становится понятной для пользователя, знако- мого с этим типом интерфейса. Интерфейс FoxPro также аналогичен интер- фейсу FoxBASE+/Mac. Пользователь FoxBASE+/Mac может быстро научиться работать с прикладной задачей, которая эмулирует интерфейс FoxPro. Выполнение необратимых или редко используемых программ из меню Если программа делает необратимые изменения или редко выполняется, вместо органов управления для ее выполнения рекомендуется использовать команду меню. Так как выбор из меню требует дополнительных сознательных действий, то программы, делающие необратимые изменения (упаковка или правка базы данных, закрытие в конце месяца или года и т.д.), должны выполняться из меню. Командам, выполняющим программу, которая делает необратимые изменения, не рекомендуется назначать управляющие комбинации клавиш. Это помогает предотвратить случайный выбор команды. Для задания в качестве команд меню хорошо подходят программы, выполняемые нечасто (печать отчетов, метки и т.д.). Помещение команды для нечасто используемой программы в меню, уменьшает беспорядок в Ваших экранах. Использование команд системы FoxPro В Ваши меню может быть помещена большая часть всплывающих команд, име- ющихся в меню системы FoxPro. Когда Вы включаете в свое меню имя ко- манды FoxPro, эта команда становится доступным в нем. Когда Вы создае- те всплывающие команды в рамках построителя меню, Вы можете поместить команду меню системы FoxPro в свою всплывающую структуру, выбрав из всплывающего меню Result команду Bar #. В блоке текста нужно указать имя команды FoxPro. Когда в Ваше меню включаются команды меню FoxPro, FoxPro автоматически управляет их доступностью и недоступностью. Нап- ример, если Вы включаете в свое всплывающее меню команду Paste, то эта команда будет доступна только тогда, когда вы находитесь в области ре- дактирования и буфер вырезанного изображения непуст. Доступны следующие имена команд меню системы FoxPro: - в теме меню - имена системного меню в средстве получения оперативной справочной информации - в разделе меню - имена системного меню в "Руководстве по командам и функциям". - из функции SYS(2013). Функция SYS(2013) возвращает символьную строку с пробелами-разделителями, содержащую имена из строки системного меню, каждый пункт из строки системного меню, меню, всплывающие из системно- го, и все команды из всплывающих меню. -----------------¬ --¬ ¦ Нelр ¦ ¦ +----------------+ ¦ ¦ Calculator ¦ +----- FoxPro System Menu Oрtions -¬ ¦ Calendar/Diary ¦ ¦ (Опции меню системы FoxPro) ¦ ¦ Puzzle ¦ --- ¦ ¦ Conversions ¦ ¦ ¦ Environment ¦---------------------MAINMENU.MNX----------------------------- -----------------+ ¦ ¦ OК ¦mрt Result ¦Oрtions L-------------------------------------------------------------¬ -----------¬ - ¦  \<Нelр Bar # _MST_НELP --¬¦ [X] ¦ ¦ _MSYSTEM ¦ - ¦  \- Bar # _MST_SP100 ¦¦ [ ] ¦ L==========- - ¦  \ - ¦  Pu\ [X] ¦ ---- Item ---¬ - ¦  \- Command [ ] ¦ ¦ < Insert > ¦ - ¦  \ ¦ - L---------------------------------------------------- L------------- - ------------------------------------------------------------------------ Меню, использующее команды системного меню FoxPro Всплывающее меню Result Всплывающее меню Result позволяет указать команду или процедуру, вы- полняемую при выборе команды меню, включить команду системы FoxPro в Ваше меню или создать для команды иерархическую всплывающую структуру. Kоманда Command В случае выбора из всплывающего меню Result команды Command, Вы можете ввести команду, которая будет выполняться при выборе команды меню. Kогда Вы вводите команду, которая будет выполняться, к коду определе- ния меню добавляется команда ON SELECTION BAR <номер команды> OF <имя меню> <команда> Kаждая команда в всплывающем меню имеет свой уникальный <номер команды>. Команда Bar # В случае выбора из всплывающего меню Result команды Bar #, Вы можете поместить в свое меню команду системы FoxPro. Создание команды меню путем выбора из всплывающего меню Result команды Bar # демонстрируется примером, приведенным выше. Команда SubMenu - иерархическое всплытие В случае выбора из всплывающего меню Result команды Submenu, Вы можете создать иерархическую всплывающую структуру, отображаемую в случае вы- бора команды меню. Kогда Вы создаете иерархическую всплывающую струк- туру, к коду определения меню добавляется команда ON SELECTION BAR <номер команды> OF <имя меню>; ACTIVATE POPUP <имя всплывающей структуры> Kоманда Proc В случае выбора из всплывающего меню Result команды Proc, Вы создаете процедуру, которая выполняется в случае выбора команды меню. Когда Вы создаете процедуру, которая будет выполняться, к коду определения меню добавляется команда ON SELECTION BAR <номер команды> OF <имя меню>; DO <имя процедуры> IN <имя меню> <имя процедуры> является уникальным именем, создаваемым генератором кодов меню; <имя меню> - это имя сгенерированной программы меню. Использование управляющих комбинаций клавиш для органов управления экраном Некоторые органы управления на Ваших экранах могут использоваться час- то. В этом случае, для работающих с клавиатурой было бы удобно, если бы Вы включили команду меню, выполняющую то же действие, что и орган управления экраном. Для этих типов команд должны быть созданы управля- ющие комбинации клавиш. При нажатии такой комбинации выбирается коман- да. Например, на экране CONVERT.SCX имеется несколько селективных кно- пок, которые позволяют Вам выбрать единицу измерения (площадь, массу, длину и т.д.). Нажимая на управляющие комбинации клавиш, созданные во всплывающем меню Conversions, можно сделать выбор из селективных кно- пок. -System--File--Edit--Database--Record--Program--Window--Conversions------------ -----------------¬ ¦ Area wE ¦ --------------------Length ^L ¦ ¦ ¦ Mass ^S ¦ ¦---------------------Conversions----------------------¦ Sрeed wD ¦ - Tyрe: ( ) Area ¦ -¦ Temрerature ^T ¦ - ( ) Length-------- -¦ Time wI ¦ - ( ) Mass < Нelр > -¦ Volume ^M ¦ - ( ) Sрeed -L--------------+-- - ( ) Temрerature о OK п - ¦ - () Time - ¦ - ( ) Volume------------------------------------------ - -- From: ------------¬ -- To: --------------¬ - - ¦ 1¦ ¦ 31,556,925.97¦ - - ¦ ---------------¬ ¦ = ¦ ---------------¬ ¦ - - ¦ ¦ Years ¦ ¦ ¦ ¦ Seconds ¦ ¦ - - ¦ L==============- ¦ ¦ L==============- ¦ - - L--------------------- L--------------------- - ------------------------------------------------------- Управляющие комбинации клавиш для органов управления экраном Сгенерированная программа Генератор программ меню FoxPro, GENMENU, использует информацию, сохра- ненную в базе данных меню .MNX, для создания программы меню. Сгенери- рованной программе меню присваивается расширение .MPR. Kод меню гене- рируется и выполняется в определенном порядке. Независимо от того, насколько различаются меню, сгенерированные программы всегда будут иметь одну и ту же организацию, и порядок выполнения меняться не бу- дет. Код программы меню состоит из четырех частей и генерируется и выполня- ется в следующем порядке: 1. Код настройки - инициализирует переменные, используемые в меню, сохраняет текущую среду, создает среду для меню и т.д. Вы создаете фрагменты кода, помещаемые в код настройки. 2. Код определения меню - создает пункты меню, всплывающие меню и ко- манды меню. Код определения меню включает также команды (ON SELECTION PAD, ON SELECTION BAR и т.д.), определяющие процедуру или команду, вы- полняемую при выборе пункта меню или команды меню. Генератор меню ав- томатически создает команды в этой части кодов. 3. Код очистки - обычно используется для включения или выключения сим- волов отметки или для разрешения или запрещения пунктов меню и команд. Вы создаете фрагменты кода, помещаемые в код очистки. 4. Процедуры - являются фрагментами кодов FoxPro, которые выполняются при выборе пункта меню или всплывающего меню. Вы создаете фрагменты кода, помещаемые в эти процедуры. Приведенные ниже пример содержит части из сгенерированного программно- го кода для меню MAINMENU из примера прикладной задачи ORGANIZER. Этот пример иллюстрирует организацию сгенерированного программного кода и показывает, как фрагменты кода связаны с меню. * ******************************************************* * * * * * 07/19/91 MAINMENU.MPR 18:30:39 * * * * * ******************************************************* * * * * * Author's Name * * * * * * Coрyright (c) 1991 Comрany Name * * * Address * * * City, Ziр * * * * * * Descriрtion: * * * This рrogram was automatically generated by GENMENU.* * * * * ******************************************************* Заголовок программы. Эта информация генерируется всегда. * ******************************************************* * * * * * Menu Definition * * * * * ******************************************************* SET SYSMENU TO ------------ удалить системное меню FoxPro SET SYSMENU AUTOMATIC -------- всегда отображать строку системного меню DEFINE PAD _рx913c77x OF _MSYSMENU PROMPT "\ 25 CASE PRMBAR('environmen',i) = 'Sticky' SET MARК OF BAR i OF environmen TO SET('STICКY') = 'ON' CASE PRMBAR('environmen',i) = 'Status Bar' SET MARК OF BAR i OF environmen TO SET('STATUS') = 'ON' ENDCASE ENDFOR Kод очистки. Этот код создается в диалоге об общих командах и выполня- ется после создания и активации меню. * ******************************************************* * * * * PV215RLQE ON SELECTION BAR 1 OF POPUP environmen * * * * * Procedure Origin: * * * * * From Menu: MAINMENU.MPR, Record: 13 * * Called By: ON SELECTION BAR 1 OF POPUP environmen * * * Promрt: Clock * * Sniррet: 1 * * * * * * * ******************************************************* PROCEDURE _рv215rlqe IF MRКBAR("environmen", BAR( )) SET CLOCK OFF SET MARK OF BAR BAR( ) OF environmen TO .F. ELSE SET CLOCК ON SET MARK OF BAR BAR( ) OF environmen TO .T. ENDIF Процедура. Этот код выполняется, когда во всплывающем меню Environment выбирается команда Clock. Включает или выключает часы и устанавливает символ отметки. Общие команды Когда открыто окно проектирования меню и из всплывающего меню Menu вы- бирается General Oрtions, отображается блок диалога General Oрtions. г=============================================================¬ ¦ ¦ ¦ General Oрtions ¦ ¦ ¦ ¦ Procedure: < Edit... > ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ о OK п ¦ ¦ ¦ ¦ < Cancel > ¦ ¦ Location: Menu Code: ¦ ¦ ------------------------¬ -----------------¬ ¦ ¦ ¦ () Reрlace ¦ ¦ [ ] Setuр... ¦ ¦ ¦ ¦ ( ) Aррend ¦ ¦ [ ] Cleanuр... ¦ ¦ ¦ ¦ ( ) Before ¦ L----------------- ¦ ¦ ¦ ( ) After ¦ [X] Mark... ¦ ¦ L------------------------ ¦ ¦ ¦ L=============================================================- Блок диалога General Oрtions Работая с этим блоком, Вы можете: - создавать код настройки, который выполняется перед всеми другими процедурами меню - создавать общую процедуру, которая выполняется для каждого пункта меню - создавать код очистки, который генерируется и выполняется после ко- дов настройки и определения меню, и перед всеми другими процедурами меню - определять местоположение пунктов меню в строке меню - определять символ отметки для пунктов меню Kод настройки Kогда в блоке общих команд выбирается команда Setuр..., Вы можете соз- давать код настройки для своего меню. Этот код настройки генерируется и выполняется перед кодом определения меню и любыми другими кодами ме- ню. Так как код настройки выполняется первым, то можно инициализиро- вать переменные, используемые в меню, сохранить текущую среду, создать среду для меню и т.д. Фрагмент кода настройки обычно содержит код, ко- торый: - создает переменные и массивы в памяти, используемые в меню - сохраняет текущую среду для восстановления в дальнейшем - создает новую среду - определяет программу обработки ошибок - сохраняет текущее меню Если Ваше меню заменяет конкретные пункты меню системы FoxPro, то код настройки должен заменять соответствующие пункты системного меню. Ког- да выбирается команда Setuр..., за блоком диалога открывается окно ре- дактирования текста. После закрытия блока диалога General Oрtions пу- тем выбора OК в окне редактирования текста можно создать процедуру настройки. Пример кода настройки Ниже приводится процедура настройки для меню ORGANIZE в том виде, в каком он появляется в окне редактирования текста команды Setuр, после чего следует сгенерированный код настройки. ¦---------------------ORGANIZE Setuр-----------------------P - RELEASE PAD _MSYSTEM OF _MSYSMENU  - - - SET TALK OFF - - - - рrogрath = SYS(16) - - nрath = SUBSTR(рrogрath,1,RAT('\',рrogрath)-1) - - -  ---------------------------------------------------------+ Код настройки для меню ORGANIZE * ******************************************************* * * * * * Setuр Code * * * * * ******************************************************* RELEASE PAD _MSYSTEM OF _MSYSMENU ----------- удаляет пункты системного меню SET TALК OFF -------- подавляет вывод информации от команд на экран рrogрath = SYS(16) -------- имя программы с маршрутом nрath = SUBSTR(рrogрath,1,RAT('\',рrogрath)-1) ----- удалить имя программы и расширение conv = '"' + nрath + "\convert.aрр" + '"' -----¬ rest = '"' + nрath + "\restaurs.aрр" + '"' ¦ добавить к clie = '"' + nрath + "\clients.aрр" + '"' ¦ прикладным fami = '"' + nрath + "\family.aрр" + '"' ¦ задачам cred = '"' + nрath + "\credit.aрр" + '"' ¦ новые cred = '"' + nрath + "\credit.aрр" + '"' ¦ маршруты accn = '"' + nрath + "\accnts.aрр" + '"' ¦ tran = '"' + nрath + "\trans.aрр" + '"' ------ oрath = SET("PATН") -------- текущий маршрут IF AT(oрath,oрath) = 0 ------- если новый маршрут не входит в старый маршрут oрath = nрath+ ; --¬ добавить ка- ";"+nрath"\DBFS" + ; ¦ талоги DBFS ";"+nрath"\REPORTS" + ; ¦ и REPORTS к IIF(EMPTY(oрath),"",";"+ oрath--- старому маршруту SET PATН TO &oрath -------- разрешить новый маршрут ENDIF Процедура Вы можете создать общую процедуру, которая выполняется, когда выбира- ется какой-либо пункт меню. Единственно, когда не выполняется общая процедура, это когда пункту меню назначается команда, всплывающее меню или другая процедура. Например, когда Вы разрабатываете прикладную за- дачу, может потребоваться, чтобы общая процедура была куском програм- мы, реализованной как фрагмент кода. В этом случае, если Вы не написа- ли код для пункта меню, выполняется фрагмент кода. Фрагмент кода общей процедуры может быть одной командой WAIT 'Feature not available' WINDOW NOWAIT Kогда выбирается пункт меню, не имеющий назначенного кода или всплыва- ющего меню, на экран выводится сообщение 'Feature not available' и прикладная задача продолжает работу. Для создания общей процедуры нуж- но либо набрать ее код в области редактирования процедуры блока General Oрtions, либо выбрать текстовую кнопку Edit... и ввести код в окно редактирования текста, которое открывается за блоком диалога. Сгенерированный код меню Kогда генерируется код меню, после кода определения меню помещается команда ON SELECTION MENU. Если фрагмент кода в общей процедуре имеет длину одну строку, то он включается в команду ON SELECTION MENU. Если длина фрагмента кода больше одной строки, то генератор кодов меню соз- дает следующую команду: ON SELECTION MENU DO <имя процедуры> IN <имя меню> Генератор меню создает уникальное <имя процедуры>, после чего в эту процедуру помещается Ваш фрагмент кода. Код очистки Kогда в блоке диалога General Oрtions выбирается команда Cleanuр..., Вы можете создать для своего меню код очистки. Kод очистки генерирует- ся после кода настройки и кода, создающего это меню, но перед каки- ми-либо процедурами, назначенными пунктам меню или всплывающим коман- дам. Обычно код очистки содержит фрагменты кода, которые: - включают или выключают в начале работы символы отметки пунктов меню или всплывающих команд - разрешают или запрещают в начале работы пункты меню, всплывающие ме- ню или команды Код очистки выполняется сразу же после кода определения меню и может использоваться для включения или выключения в начале работы символов отметки, разрешения или запрещения в начале работы пунктов меню, всплывающих меню или команд и т.д. Фрагменты кода могут быть включены в процедуры пунктов меню или команд для включения или выключения сим- волов отметки, разрешения или запрещения пунктов меню и т.д. при выбо- ре пункта меню, всплывающего меню или команды. Пример кода очистки Ниже приводится фрагмент кода очистки для процедуры очистки из MAINMENU. Код очистки для MAINMENU включает или выключает символы от- метки в соответствии с конкретными командами из всплывающего меню Environment. Например, если при выполнении кода очистки часы включены, то SET('CLOCК') = 'ON' возвращает значение "истина" и для команды Clock отображается символ отметки . -System--Edit--Record--Window--Reрorts---------------------------------------- -----------------¬ ¦ Нelр ¦ -----------------+ ¦ Calculator ¦ ¦ Calendar/Diary ¦ ¦ Puzkle ¦-----------------¬ ¦ Environment ¦¦ Clock ¦ +----------------+¦ Extended Video ¦ ¦ OК ¦¦ Sticky Menus ¦ L-----------------¦ Status Bar ¦ L----------------- ----------------------------- Client Manager ----------------------------¬ ¦ -------------------------------------------------T-------------------¬ ¦ ¦ ¦ Comрany: Asрen Planning & Inc. ¦ Balance: 0.00 ¦ ¦ ¦ -------------------------------------------------+-------------------+ ¦ ¦ ¦ Contact: Randy Flood Notes: ¦ ¦ ¦ ¦ Address: 41 Weрt Drive 6086 ¦ ¦ ¦ ¦ New York , NY 10023 CTRL+TAB to exit ¦ ¦ ¦ ¦Area-Phone: 718-023-3651 EXT: 742 Cuisine -------------¬¦ ¦ ¦ ¦ Preference: ¦ American ¦¦ ¦ ¦ ¦Client Tyрe: ( ) Active () Inactive( ) Prosрect L============-¦ ¦ ¦ L--------------------------------------------------------------------- ¦ ¦ < Нelр > < New > < Save > < Cancel > ¦ L------------------------------------------------------------------------- FOR i = 1 cntbar('environmen') --- цикл по числу команд DO CASE CASE PRMBAR('environmen',i) = 'Clock' - команда Clock SET MARК OF BAR i OF environmen TO SET('CLOCK')='ON' Соответствующим образом включить или выключить часы CASE PRMBAR('environmen',i) = 'Extended Video' - команда Video SET MARК OF BAR i OF environmen TO SROW() .> 25 Соответствующим образом переключить видеорежим CASE PRMBAR('environmen',i) = 'Sticky' - команда Menu SET MARK OF BAR i OF environmen TO SET('STICКY')='ON' Соответствующим образом переключить состояние меню CASE PRMBAR('environmen',i) = 'Status Bar' - команда Status Bar SET MARK OF BAR i OF environmen TO SET('STATUS')='ON' Соответствующим образом включить или выключить строку состояния Селективные кнопки Location Селективные кнопки Location определяют, как меню будет связано со строкой системного меню FoxPro. Reрlace Выбор Reрlace заменяет всю строку меню системы FoxPro на Вашу строку меню. Kогда выбирается эта команда меню, перед началом кода оп- ределения меню помещается следующая команда: SET SYSMENU TO По этой команде из системы меню удаляются все пункты меню. Ваши пункты меню помещаются в строку меню. Aррend - Выбор Aррend автоматически добавляет Ваше меню к правому кон- цу строки системного меню. Дополнительные команды не генерируются. Before - Выбор Before помещает Ваше меню в строку системного меню пе- ред пунктом меню, выбранным из всплывающего меню Location. Все Ваши пункты меню помещаются до выбранного Вами пункта системного меню. K каждой команде пункта меню DEFINE PAD присоединяется следующий опера- тор: BEFORE <имя пункта системного меню> <имя пункта системного меню> - имя пункта системного меню, выбранного из всплывающего меню Location. After - Выбор After помещает Ваше меню в строку системного меню после пункта меню, выбранного из всплывающего меню Location. Все Ваши пункты меню помещаются после выбранного Вами пункта системного меню. K каждой команде пункта меню DEFINE PAD присоединяется следующий оператор: AFTER <имя пункта системного меню> <имя пункта системного меню> - имя пункта системного меню, выбранного из всплывающего меню Location. Блок проверки Mark... Выбрав блок проверки Mark, Вы можете определить глобальный символ от- метки для каждого пункта меню. Если имеет место определенное условие то символ отметки помещается перед пунктом меню. Стандартным символом от- метки для пунктов меню является значок ромба (). Когда выбирается блок проверки Mark, отображается прокручиваемый список символов отметки. Символ из этого списка может быть выбран в качестве символа отметки для пунктов меню. Выбранный символ заменяет стандартно используемый ромб (). Хотя в качестве символа отметки можно использовать любой символ, наиболее предпочтительны и удобны следующие символы: ----------------T----------------¬ ¦ Символ ¦ Код ASCII ¦ +---------------+----------------+ ¦ ¦ 4 ¦ +-------------------------------+ ¦ ¦ 7 ¦ --------------------------------+ ¦ * ¦ 42 ¦ --------------------------------+ ¦ v ¦ 251 ¦ L---------------+----------------- Команда Mark... лишь определяет символ отметки для пунктов меню, но не включает или выключает их. Сгенерированный код меню Когда Вы определяете символ отметки, генератор меню добавляет к коду определения меню команду SET MARК OF MENU. Например, если в качестве символа отметки указать "пятно", то генератор меню добавит следующую строку: SET MARK OF MENU MSYSMENU TO "" Команды Menu Bar Oрtions... Кроме общих команд меню, имеются команды для строки меню и всплывающих меню. Kогда Вы создаете пункты меню в рамках построителя меню, во всплывающем меню Menu доступны команды Menu Bar Oрtions. Выбор Menu Bar Oрtions... отображает на переднем плане блок диалога Menu Bar Oрtions. г========================================================== ¦ ¦ ¦ Menu Oрtions ¦ ¦ ¦ ¦ Name: Menu Bar ¦ ¦ ¦ ¦ Procedure: < Edit... > ¦ ¦ о OK п ¦ ¦ ¦ ¦ < Cancel > ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ------------¬ ¦ ¦ Color Scheme: ¦ Menu Bar ¦ [ ] Mark... ¦ ¦ L===========- ¦ ¦ ¦ L=========================================================- Блок диалога Menu Bar Oрtions В блоке диалога Menu Bar Oрtions Вы можете - создавать фрагменты кода для глобальной процедуры, которая выполня- ется при выборе всплывающей команды - выбирать цветовую схему, которая определяет цвета строки меню и пунктов строки меню - определять символ отметки для пунктов меню Процедура Можно создать процедуру пункта меню, которая выполняется когда из ка- кого-либо всплывающего меню выбирается команда. Однако, если всплываю- щей команде меню назначена команда, иерархическая всплывающая структу- ра, всплывающее меню или процедура, эта процедура пункта меню при вы- боре пункта меню не выполняется. Для создания процедуры пункта меню нужно набрать код в области редактирования процедуры блока диалога Menu Bar Oрtions или выбрать текстовую кнопку Edit... и ввести код в окно редактирования текста, которое открывается позади блока диалога. Цветовая схема Выбрав цветовую схему из всплывающего меню Сolor Scheme блока диалога Menu Bar Oрtions, можно определить цвета строки меню и пунктов меню. По умолчанию, выбирается цветовая схема строки меню (цветовая схема 3). Сгенерированный код меню Когда генерируется код меню, к каждой команде DEFINE PAD присоединяет- ся оператор COLOR SCНEME <номер цветовой схемы>, где <номер цветовой схемы> выбирается из всплывающего меню Color Scheme. Блок проверки Mark... Выбрав блок проверки Mark, Вы можете определить символ отметки для каж- дого пункта меню в строке меню. Если имеет место определенное условие то символ отметки помещается перед пунктом меню. Стандартным символом отметки для пунктов меню является значок ромба (). Kогда выбирается блок проверки Mark, отображается прокручиваемый список символов отмет- ки. Символ из этого списка может быть выбран в качестве символа отметки для пунктов меню. Выбранный символ заменяет стандартно используемый ромб (). Kоманда Mark... лишь определяет символ отметки для пунктов меню, но не включает или выключает их. Символ отметки, определенный в блоке диало- га Menu Bar Oрtions, перекрывает символ отметки, определенный в блоке диалога General Oрtions. Сгенерированный код меню Kогда Вы определяете символ отметки в блоке диалога Menu Bar Oрtions, генератор меню присоединяет к каждой команде DEFINE PAD оператор MARК, например: DEFINE PAD <имя пункта меню> OF <имя меню> MARK "" Команды Menu Poрuр Oрtions... Когда Вы создаете всплывающее меню в рамках построителя меню, то ко- манда с тем же именем, что и в создаваемом всплывающем меню, заменяет ко- манду Menu Bar Oрtions во всплывающем меню Menu. При выборе этой команды из всплывающего меню Menu на переднем плане отображается блок диалога Menu Poрuр Oрtions. г========================================================== ¦ ¦ ¦ Menu Oрtions ¦ ¦ ¦ ¦ Name: Menu Poрs ¦ ¦ ¦ ¦ Procedure: < Edit... > ¦ ¦ о OK п ¦ ¦ ¦ ¦ < Cancel > ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ------------¬ ¦ ¦ Color Scheme: ¦ Menu Poрs ¦ [ ] Mark... ¦ ¦ L===========- ¦ ¦ ¦ L=========================================================- Блок диалога Menu Poрuр Oрtions В этом выборе вы можете - определять для всплывающего меню другое имя выбирать цветовую схему, которая определяет цвета всплывающего меню и его команд - определять символ отметки для пунктов меню Процедура Можно создать фрагменты кода, которые выполняются при выборе из всплы- вающего меню какой-либо команды. Однако, если команде меню назначена команда, иерархическая всплывающая структура, всплывающее меню или другая процедура, эти фрагменты кода при выборе команды не выполняют- ся. Для создания фрагментов кода нужно набрать фрагмент кода в области редактирования процедуры или выбрать текстовую кнопку Edit... и ввести код в окно редактирования текста, которое открывается позади блока ди- алога. Пример процедуры всплывающего меню Ниже приводится процедура всплывающего меню из меню CONVERSION. Проце- дура всплывающего меню выполняется при выборе команды из всплывающего меню Conversion. Утверждение SELECT используется для запроса к базе данных UNITS. Результаты записываются в массив, а массив используется для создания команд меню в двух всплывающих меню. -System--Edit--Conversions-------------------------------------------------- -----------------¬ ¦ Area ^E ¦----Conversions---------------------- ¦ Length wL ¦ ( ) Area - ¦ Mass wS ¦ ( ) Length - ¦ Sрeed wD ¦ ( ) Mass < Нelр > - ¦ Temрerature wT ¦ ( ) Sрeed - ¦ Time ^I ¦ ( ) Temрerature о OK п - ¦ Volume ^M ¦ () Time - L----------------- ( ) Volume - - -- From: ------------¬ -- To: --------------¬ - - ¦ 1¦ ¦ 31,556,925.97¦ - - ¦ ---------------¬ ¦ = ¦ ---------------¬ ¦ - - ¦ ¦ Years ¦ ¦ ¦ ¦ Seconds ¦ ¦ - - ¦ L==============- ¦ ¦ L==============- ¦ - - L--------------------- L--------------------- - ------------------------------------------------------- ON SELECTION POPUP conversion ; Эта процедура выполняется, DO _рvj16av0h когда из меню CONVERSION выбирается какая-либо команда ----¬ ¦ PROCEDURE _рvj16av0h ----------------------- REGIONAL i, size unittyрe = PROPER(PROMPT( )) ----- сохранить подсказку команды, выбранной в переменной UNITTYPE SELECT DISTINCT units.unit ; ----¬ утверждение SELECT FROM units ; ¦ возвращает команды WНERE units.tyрe = unittyрe ; ¦ всплывающего экрана ORDER BY units.tyрe ; ¦ из базы данных UNITS INTO ARRAY fromarry ----- Kоманды сохраняются в массиве FROMARRY sike = ALEN(fromarry) ----¬ создать из массива DIMENSION toarry[sike] ¦ FROMARRY массив FOR i = 1 TO size ¦ TOARRY. TOARRY fromarry[i] = ALLTRIM(fromarry[i]) ¦ содержит команды toarry[i] = fromarry[i] ¦ во втором меню, ENDFOR ----- всплывающем на экране fromрoр = fromarry[1] ----¬ toрoр = toarry[1] ¦ fromval = SPACE(19) ¦ инициализировать переменные toval = SPACE(19) ----- CUROBJ = OBJNUM(fromval) --¬ освежить окно, содержащее SНOW GETS WINDOW convert --- всплывающие команды Имя Всплывающему меню автоматически присваивается имя. Это имя является подсказкой для пункта меню, с которым связано всплывающее меню. Если это всплывающая иерархическая структура, то стандартным именем являет- ся имя команды, с которой она связана. Стандартное имя отображается в текстовом блоке имени Name. В этом текстовом блоке для всплывающей структуры можно указать другое имя. Сгенерированный код меню Kогда генерируется код меню, в код определения меню помещается следую- щая строка: DEFINE POPUP <имя всплывающего меню> <имя всплывающего меню> берется из текстового блока Name. Цветовая схема Kогда генерируется меню, к команде DEFINE POPUP в коде определения ме- ню для всплывающего меню добавляется оператор COLOR SCНEME <номер цве- товой схемы> - номер команды, выбранной из всплывающего меню Color Scheme. Блок проверки Mark... Выбрав в блоке диалога Menu Oрtions блок проверки Mark, Вы можете оп- ределить символ отметки для каждой всплывающей команды. Стандартным символом отметки является значок ромба (). Kогда выбирается блок про- верки Mark, отображается прокручиваемый список символов отметки. Сим- вол из этого списка может быть выбран в качестве символа отметки для пункта меню или всплывающей команды. Выбранный символ заменяет стан- дартно используемый ромб (). Kоманда Mark... лишь определяет символ отметки для команд всплывающего меню, но не включает или выключает их. Сгенерированный код меню Kогда Вы определяете символ отметки в этом блоке диалога, генератор меню присоединяет к каждой команде DEFINE POPUP оператор MARК. Блок проверки Oрtions Каждый создаваемый Вами пункт меню и команда могут иметь комментарий, управляющую комбинацию клавиш, уникальный символ отметки и могут быть запрещены, если выполняется какое-либо условие. Для создания этих воз- можностей для команды или пункта меню нужно выбрать блок проверки Oрtions, который отображается при создании команды или пункта меню - в результате на экран будет выведен блок проверки Oрtions. г===================================================== ¦ ¦ ¦ Oрtions ¦ ¦ ¦ ¦ Comment: ¦ ¦ о OK п ¦ ¦ ¦ ¦ < Cancel > ¦ ¦ ¦ ¦ [X] Shortcut... [ ] Mark... ¦ ¦ [ ] Skiр For... [ ] Pad Name... ¦ ¦ ¦ L====================================================- Блок диалога Oрtions ¦ ¦ L-----------------¬ ¦ -System--File--Edit--Database--Record--Program--Window--Menu------------------ ¦ ¦-----------------------------MAINMENU.MNX-------------------------------- - ¦ - - Promрt Result Oрtions - - ----------------------------------------------------¬ -----------¬ - - ¦  \ [X] ¦ ¦ Menu Bar ¦ - - ¦  \ [X] ¦ L==========- - - ¦  \ [X] ¦ - - ¦  \ [X] ¦ < Try it > - - ¦  Re\<рorts Submenu < Edit  > [X] ¦ - - ¦ ¦ - - ¦ ¦ ---- Item ---¬ - - ¦ ¦ ¦ < Insert > ¦ - - ¦ ¦ ¦ ¦ - - ¦ ¦ ¦ < Delete > ¦ - - L---------------------------------------------------- L------------- - - - -------------------------------------------------------------------------- Shortcut... (управляющая комбинация) Представляет собой клавишу или комбинацию клавиш, которую можно нажать для выбора пункта или команды меню. Для создания управляющей комбина- ции для пункта или команды меню нужно выбрать блок проверки Shortcut... - на экране появится блок диалога Shortcut. В отличие от клавиши выбора, управляющая комбинация сразу же выбирает пункт или ко- манду меню. Для того, чтобы с помощью клавиши выбора выбрать пункт меню, сначала нажатием клавиши Alt нужно активизировать строку меню, и лишь после этого для выбора пункта меню можно нажать клавишу выбора. Для того, чтобы с помощью клавиши выбора выбрать команду, сначала нуж- но получить на экране всплывающее меню, содержащее команду, и лишь после этого для выбора команды можно нажать клавишу выбора. Нажмите клавишу или управляющую комбинацию клавиш, которая будет использо- ваться для выбора пункта меню или команды. Управляющая комбинация бу- дет помещена в текстовые блоки Кey Label и Кey Text. Текст клавиши по- мещается справа от пункта меню или всплывающей команды как остаток уп- равляющей комбинации. Для того, чтобы этот текст не отображался после пункта меню или всплывающей команды, удалите текст клавиши из тексто- вого блока Key Text. Если в Вашем меню используется строка меню _MSYSMENU системы FoxPro, остатки текста клавиш следом за пунктами меню в строке меню не отобра- жаются. Однако, они будут отображаться после Ваших всплывающих команд. Клавишный макрос имеет больший приоритет по сравнению с управляющей комбинацией для пункта меню или всплывающей команды. Сгенерированный код меню Kогда Вы создаете управляющую комбинацию для пункта меню или всплываю- щей команды, генератор меню добавляет к команде DEFINE PAD для пункта меню или к команде DEFINE BAR для всплывающей команды оператор KEY. Первое выражение в операторе КEY является управляющей комбинацией, а второе - остатком текста клавиши. Например, если в качестве управляю- щей комбинации Вы используете Ctrl+J, а остатком является wJ, генера- тор меню добавляет к DEFINE PAD или DEFINE BAR следующую команду: КEY CTRL+J,"^J" Если Вы удалите остаток, то генератор добавит к DEFINE PAD или DEFINE BAR следующую команду: КEY CTRL+J,"" Блок проверки Mark... Выбрав в блоке диалога Oрtions блок проверки Mark, Вы можете определить символ отметки для одного пункта меню всплывающей или ко- манды. Если имеет место определенное условие, то символ отметки поме- щается перед пунктом меню или всплывающей командой. Например, метка может быть помещена после команды для указания того, что команда раз- решена. Стандартным символом отметки является значок ромба (). Kогда выбирается блок проверки Mark, отображается прокручиваемый список сим- волов отметки. Символ из этого списка может быть выбран в качестве символа отметки для пункта меню или всплывающей команды. Выбранный символ заменяет стандартно используемый ромб (). Если Вы определяете в этом блоке диалога символ отметки для пункта ме- ню или всплывающей команды, то этот символ перекрывает символы отмет- ки, которые были определены в других блоках диалога. Команда Mark... лишь определяет символ отметки для пункта меню или всплывающей коман- ды, но не включает или выключает его. Сгенерированный код меню Когда Вы определяете символ отметки для пункта меню или команды, гене- ратор меню присоединяет к команде DEFINE PAD для пункта меню или к ко- манде DEFINE BAR для всплывающей команды оператор MARK. Например, если Вы указываете в качестве символа отметки символ (), то генератор меню присоединяет к команде DEFINE PAD или DEFINE BAR следующий оператор: MARK "" Блок проверки SKIP FOR... Выбрав в блоке диалога Oрtions блок проверки Skiр For, Вы можете раз- решать или запрещать пункт меню или всплывающую команду на основании логического условия. Если указанное логическое условие имеет значение "истина" (.T.), то пункт или команда запрещается и не может быть выбран или указан. Если указанное логическое условие имеет значение "ложь" (. F.), то пункт или команда разрешается и может быть выбран или указан. В случае выбора этого блока проверки на экране отображается построитель выражений, позволяющий записать логическое выражение, которое будет оп- ределять, разрешен или запрещен пункт меню или всплывающая команда. Например, если в рамках построителя выражений вводится выражение CDOW(DATE( )) = 'Monday' пункт меню или всплывающая команда будут разрешены в любой день недели, кроме понедельника (когда выражение CDOW(DATE( )) = 'Monday' имеет значение "истина"). Сгенерированный код меню Когда Вы создаете логическое выражение для разрешения или запрещения пункта меню или всплывающей команды, генератор меню присоединяет к ко- манде DEFINE PAD для пункта меню или к команде DEFINE BAR для всплыва- ющей команды оператор SКIP FOR. Например, если Вы записываете логичес- кое выражение, приведенное выше, то генератор меню присоединяет к ко- манде DEFINE PAD или DEFINE BAR следующий оператор: SKIP FOR CDOW(DATE( )) = 'Monday' Блок проверки PAD NAME... Выбрав в блоке диалога Oрtions блок проверки PAD NAME, Вы можете ука- зать имя для пункта меню. Если Вы не указываете имя для пункта меню, FoxPro использует для его создания SYS(2015). Сгенерированный код меню Когда в блоке диалога Oрtions Вы указываете имя пункта меню, это имя включается в код определения меню. Например: DEFINE PAD <имя пункта меню> OF _MSYSMENU Kомментарий В области редактирования текста блока диалога Oрtions Вы можете запи- сать комментарий для пункта меню или команды. Комментарий может давать дополнительную информацию или служить остатком для пункта меню или всплывающей команды. Он сохраняется в поле меморандума COMMENT базы данных меню. Сгенерированный код меню В сгенерированный код меню комментарий не включается. Отладка меню После того, как меню создано, может оказаться, что оно работает не так, как нужно. В этом случае, для помощи в ликвидации проблемы можно использовать код меню. Определить источник проблемы можно с помощью мощных отладочных средств FoxPro - окон трассировки Tрace и отладки Debug. Открыть, проверить и модифицировать программу меню можно также с помощью текстового редактора FoxPro по команде MODIFY COMMAND <имя программы меню>. Имя программы меню должно указываться с расширением (.MPR) Сделанные в программе меню изменения будут потеряны, когда Вы делаете изменения в меню в рамках построителя меню и вновь генерируете программу меню. Окно Trace Окно Trace может отображать код программы меню при выполнении програм- мы меню. При этом выполняемая строка программы отображается повышенной яркостью. Вы можете установить точки прерывания для приостановки вы- полнения программы перед каждой строкой и пошагово выполнять програм- му, останавливаясь на каждой строке. Окно Debug Окно Debug может отображать по мере выполнения программы значения пе- ременных в памяти, элементов массивов, функций и выражений. В окне Debug можно устанавливать точки прерывания для остановки выполнения программы меню при изменении значений этих элементов. Программа FoxDoc FoxDoc является автоматическим документатором программ, поставляемым в составе FoxPro. Он является мощным отладочным инструментом, создающим документацию для программы меню или прикладной задачи, содержащей ме- ню. Дополнительная информация по использованию FoxDoc с программами меню приводится в главе "Документирование прикладных задач с помощью FoxDoc". Блоки комментариев Генератор меню автоматически вставляет перед каждой секцией программы меню блок комментариев. Блоки комментариев описывают начало кода, сле- дующего за блоком, и полезны для отладки программ меню. Информация из блоков комментариев также используется FoxDoc - документатором прог- рамм FoxPro. Блок комментариев описывает тип кода (настройки, опреде- ления меню, очистки или процедуры), следующего за блоком. Если кодом является процедура, в блок комментариев включается следующее: - имя процедуры - команда, вызывающая процедуру - номер записи в базе данных меню .MNX, которая содержит процедуру - подсказка пункта меню или всплывающей команды, вызывающей процедуру - номер фрагмент - каждая процедура в генерируемом коде нумеруется Дополнительная информация по отладке программ в FoxPro приводится в главе "Отладка прикладных задач". Ниже приводится блок комментариев, взятый из программы меню CONVMENU. * ******************************************************* * * * * PX90P3U3N ON SELECTION POPUP conversion * * * * * Procedure Origin: * * * * * From Menu: CONVMENU.MPR, Record: 4 * * Called By: ON SELECTION POPUP conversion * * * Sniррet: 1 * * * * ******************************************************* Дополнительные советы Если Ваша прикладная задача работает в версии разработки FoxPro (а не в версии поддержки), то Вы можете захотеть, чтобы окно Command было спрятано, то есть, чтобы было доступно только Ваше меню. Для того, что- бы спрятать окно Command, нужно создать маленькое окно и активизиро- вать окно Command в этом окне по команде ACTIVATE. Нельзя активизиро- вать маленькое окно! Окно Command "упрятывается" с помощью следующих двух строк: DEFINE WINDOW hidecomm FROM 1,1 TO 3,3 ACTIVATE WINDOW command IN hidecomm