Команда DEFINE POPUP

Создает меню.

Синтаксис:

DEFINE POPUP MenuName
	[FROM nRow1, nColumn1]
	[TO nRow2, nColumn2]
	[IN [WINDOW] WindowName | IN SCREEN]
	[FONT cFontName [, nFontSize]]
	[STYLE cFontStyle]
	[FOOTER cFooterText]
	[KEY KeyLabel]
	[MARGIN]
	[MARK cMarkCharacter]
	[MESSAGE cMessageText]
	[MOVER]
	[MULTISELECT]
	[PROMPT FIELD FieldName | PROMPT FILES [LIKE FileSkeleton]
		| PROMPT STRUCTURE]
	[RELATIVE]
	[SCROLL]
	[SHADOW]
	[TITLE cMenuTitleText]
	[COLOR SCHEME nSchemeNumber
	| COLOR ColorPairList]

Параметры:
MenuName
Задает имя создаваемого меню.
FROM nRow1, nColumn1 TO nRow2, nColumn2
Указывает, где следует разместить меню. Значения nRow1, nColumn1 задают координаты левого верхнего угла меню. Если предложение FROM опущено, Visual FoxPro размещает левый верхний угол меню в первой строке и первом столбце основного окна Visual FoxPro или пользовательского окна.
Чтобы создать меню определенного размера, необходимо также задать параметр TO nRow2, nColumn2, определяющий местоположение правого нижнего угла меню. Если задать FROM nRow1, nColumn1 и опустить при этом TO nRow2, nColumn2, Visual FoxPro автоматически установит размер меню. Его ширина будет равняться ширине самого длинного элемента меню (если элементы созданы с помощью команды DEFINE BAR), а длина будет такой, какая требуется для отображения всех элементов меню. Длина меню ограничена размером содержащего его основного окна Visual FoxPro или пользовательского окна. Если размер меню недостаточен для того, чтобы вместить все его элементы, появляется полоса прокрутки, с помощью которой можно пролистать содержимое меню.
IN [WINDOW] WindowName
Помещает меню в пользовательское окно WindowName. Если это предложение опущено, меню, в случае отсутствия активных пользовательских окон, по умолчанию помещается в основное окно Visual FoxPro. Если активное пользовательское окно существует, меню помещается в это окно.
IN SCREEN
Принудительно помещает меню в основное окно Visual FoxPro.
FONT cFontName [, nFontSize]
Допустимо только в Visual FoxPro.
Задает шрифт, используемый в меню по умолчанию. Вы можете отменить принимаемый по умолчанию шрифт для отдельного элемента меню, воспользовавшись командой DEFINE BAR с предложением FONT.
cFontName задает имя шрифта, а nFontSize его размер в пунктах. Например, следующая команда создает меню с элементами, изображенными 12-пунктовым шрифтом Courier:

DEFINE MENU popMyPopup FONT 'Courier', 12

Если вы задали предложение FONT, опустив размер шрифта nFontSize, используется размер 10 пунктов. Если в Visual FoxPro заданный шрифт отсутствует, его заменяет шрифт с похожими характеристиками.
STYLE cFontStyle
Допустимо только в Visual FoxPro и в предыдущих версиях FoxPro для Windows.
Задает стиль шрифта, используемый в меню по умолчанию. Вы можете отменить принимаемый по умолчанию стиль для отдельных элементов меню командой DEFINE BAR с предложением STYLE.
Если предложение STYLE опущено, используется стиль Normal (нормальный). Если в Visual FoxPro заданный стиль шрифта отсутствует, его заменяет стиль с похожими характеристиками.
В качестве cFontStyle можно задавать следующие стили шрифтов:

Символ	Стиль шрифта
B	Bold (Полужирный)
I	Italic (Курсив)
N	Normal (Нормальный)
O	Outline (Контурный)
Q	Opaque (Непрозрачный)
S	Shadow (Затененный)
-	Strikeout (Перечеркнутый)
T	Transparent (Прозрачный)
U	Underline (Подчеркнутый)

Можно задать комбинацию стилей, указав сразу несколько символов. Например, следующая команда задает полужирный курсив (Bold Italic):

DEFINE MENU popMyPopup STYLE 'BI'

FOOTER cFooterText
Создает нижний колонтитул с текстом cFooterText, располагающимся в центре нижней границы меню.
KEY KeyLabel
Задает для меню клавишу доступа или комбинацию клавиш. Список доступных клавиш и комбинаций клавиш вместе с их названиями приведен в теме ON KEY LABEL. Задание предложения KEY эквивалентно выдаче следующей команды:

ON KEY LABEL KeyLabel ACTIVATE POPUP MenuName

Замечание. Если для заданного названия клавиши уже определена макрокоманда клавиатуры, она имеет приоритет и вы не сможете активизировать меню с помощью указанной клавиши или комбинации клавиш.
MARGIN
Оставляет дополнительные интервалы слева и справа от каждого элемента меню. В таких интервалах отображаются символы маркировки (слева от элементов меню) и стрелки, указывающие на наличие ниспадающих подменю (справа от элементов меню). Если опустить MARGIN, символ маркировки будет отображен поверх первого символа имени элемента меню, а стрелка, обозначающая иерархические меню, будут отображаться поверх последнего символа имени.
MARK cMarkCharacter
Задает символ, который ставится слева от элемента меню. В качестве символа маркировки в FoxPro для MS-DOS по умолчанию используется ромб, а в Visual FoxPro, FoxPro для Windows и FoxPro для Macintosh галочка.
Если в Visual FoxPro и FoxPro для Macintosh данное меню интегрируется в системное меню Visual FoxPro, предложение MARK игнорируется и используется символ маркировки, принимаемый по умолчанию. Кроме того, предложение MARK игнорируется, если шрифт основного окна FoxPro или пользовательского окна, в котором размещается меню, отличен от FoxFont.
Предложение MARK позволяет заменять принятый по умолчанию символ маркировки на символ, определенный аргументом cMarkCharacter. Если cMarkCharacter содержит более одного символа, в качестве символа маркировки используется только первый из них.
Замечание. Задавая символ маркировки, вы не помечаете элемент меню; используйте для этого команду SET MARK OF.
Предложение MARK устанавливает символ маркировки для всех элементов меню. Символы маркировки, заданные в команде DEFINE BAR, имеют более высокий приоритет по сравнению с символами маркировки, заданными в предложении MARK команды DEFINE POPUP. Команда SET MARK OF используется как переключатель, отображающий или убирающий символы маркировки, и позволяет задать символ маркировки для отдельного элемента меню или для всех элементов меню.
MESSAGE cMessageText
Выдает сообщение при выделении элемента меню. В FoxPro для MS-DOS сообщение cMessageText по умолчанию размещается в центре последней строки основного окна FoxPro; положение сообщения можно изменить с помощью команды SET MESSAGE.
В Visual FoxPro, FoxPro для Windows и FoxPro для Macintosh сообщение выводится в графической строке состояния. Если действует установка SET STATUS ON, включающая отображение строки состояния в символьном режиме, сообщение располагается в центре последней строки основного окна Visual FoxPro.
MOVER
Ставит слева от выделенного элемента меню в кнопке перемещения двунаправленную стрелку Перемещая эту стрелку мышью, вы можете переставить данный элемент на другую позицию в меню. Чтобы определить, в каком месте меню позиционируется тот или иной элемент, можно воспользоваться функцией GETBAR( ).
Нельзя переупорядочивать элементы меню, созданные с помощью предложения PROMPT.
MULTISELECT
Разрешает пользователю выделять сразу несколько элементов меню. Когда пользователь выбирает элемент меню, слева от этого элемента ставится символ маркировки.
В меню, созданном с помощью предложения PROMPT, нельзя выделять сразу по нескольку элементов.
Чтобы определить, какие элементы меню выбраны, можно воспользоваться функцией MRKBAR( ).
Если вы задали в команде DEFINE POPUP ключевое слово MULTISELECT, то с помощью опции MARGIN вы можете зарезервировать место для символа маркировки возле каждого элемента меню.
В следующем примере создается меню popFruits. Используется опция MULTISELECT, чтобы в меню можно было выбирать несколько элементов.
У каждого из четырех элементов меню свой символ маркировки. Когда пользователь выбирает в меню элементы, они помечаются и выводятся на экран специальной программой yourchoice.

CLEAR
IF NOT _DOS
	MODIFY WINDOW SCREEN FONT 'foxfont', 12
ENDIF
ACTIVATE SCREEN
DEFINE POPUP popFruits FROM 5,5 ;
	MULTISELECT MARGIN				&& Create multi-choice menu
DEFINE BAR 1 OF popFruits ;
	PROMPT '\<Apples'  MARK CHR(3) 	&& First item
DEFINE BAR 2 OF popFruits ;
	PROMPT '\<Bananas' MARK CHR(4) 	&& Second item
DEFINE BAR 3 OF popFruits ;
	PROMPT '\<Grapes'  MARK CHR(5) && Third item
DEFINE BAR 4 OF popFruits ;
	PROMPT '\<Lemons'  MARK CHR(6)	 && Fourth item
@ 12,5 SAY 'Your choices:'
ON SELECTION POPUP popFruits DO yourchoice 	&& Choice routine
ACTIVATE POPUP popFruits 
PROCEDURE yourchoice				&& Executed when choice is made
@ 13,5 CLEAR
FOR gnCount = 1 TO CNTBAR('popFruits')		&& Loop for # of items
	IF MRKBAR('popFruits', gnCount) = .T.		&& Option is marked,
		? PRMBAR('popFruits', gnCount) AT 5		&& display caption
	ENDIF
NEXT

PROMPT FIELD FieldName
Задает имя поля в открытой таблице, записи которого становятся элементами меню. Для каждой записи этой таблицы в меню будет предусмотрен один элемент. При активизации меню рабочая область таблицы выбирается.
Совет. Вы можете воспользоваться оптимизацией по технологии Rushmore, если установите фильтр для поля, указанного в предложении PROMPT FIELD. Подробнее об оптимизации по технологии Rushmore см. темуSET OPTIMIZE и главу 17 "Оптимизация приложений" Руководства разработчика.
В качестве FieldName можно задать несколько имен полей, соединив их знаком сложения (+). FieldName также может быть именем поля в таблице, открытой в другой рабочей области, или пользовательской функцией.
В стандартной (16-разрядной) версии FoxPro для MS-DOS максимальное количество элементов, которое можно включить в меню с помощью предложения PROMPT FIELD, равно 32767. Если в таблице больше записей, FoxPro выдаст сообщение об ошибке. В расширенной (32-разрядной) версии FoxPro для MS-DOS, а также в Visual FoxPro, FoxPro для Windows и FoxPro для Macintosh число элементов, которые можно включить в меню с помощью предложения PROMPT FIELD, не ограничено.
PROMPT FILES [LIKE FileSkeleton]
Создает меню, в котором отображаются имена файлов текущего каталога. Аргумент LIKE FileSkeleton позволяет ограничить диапазон отображаемых в меню файлов, используя символы подстановки. Например, чтобы создать меню, в котором отображались бы имена таблиц диска и каталога, принимаемых по умолчанию, выдайте следующую команду:

PROMPT FILES LIKE *.DBF

Можно создать меню, содержащее имена файлов с других дисков и из других каталогов; для этого нужно задать спецификацию диска и/или спецификацию каталога. Например, чтобы создать меню, состоящее из файлов программ в каталоге PROGRAMS на диске C, выдайте следующую команду:

PROMPT FILES LIKE C:\PROGRAMS\*.PRG

PROMPT STRUCTURE
Отображает в меню имена полей текущей таблицы в соответствии с их структурой. При активизации меню рабочая область таблицы становится выбранной.
RELATIVE
Задает порядок размещения элементов в меню. Если меню создано без участия предложения RELATIVE, элементы в меню располагаются в соответствии с номерами их строк. Для неопределенных элементов в меню резервируется место. Например, если определить в меню первый и третий элементы, а затем активизировать его, в меню будет вставлена пустая строка, зарезервированная для второго элемента.
Если вы создаете меню с предложением RELATIVE, элементы будут появляться в этом меню в порядке их определения. Для неопределенных элементов в таких меню место не резервируется.
Если меню определено с опцией RELATIVE, это позволит воспользоваться предложениями BEFORE и AFTER в команде DEFINE BAR для позиционирования элементов в меню относительно других элементов. Если меню создано без опции RELATIVE, то включение в команду DEFINE BAR предложения BEFORE или AFTER вызовет ошибку.
Выполните следующие два примера программ и сравните порядок размещения элементов в каждом меню.

*** RELATIVE Example  ***
DEFINE POPUP popRelatYes RELATIVE FROM 1,1
DEFINE BAR 4  OF popRelatYes PROMPT '4444'
DEFINE BAR 3  OF popRelatYes PROMPT '3333'
DEFINE BAR 2  OF popRelatYes PROMPT '2222'
DEFINE BAR 1  OF popRelatYes PROMPT '1111'
DEFINE BAR 6  OF popRelatYes PROMPT '6666' BEFORE 4
ACTIVATE POPUP popRelatYes 
*** NON-RELATIVE Example ***
DEFINE POPUP popRelatNo FROM 1,1
DEFINE BAR 4  OF popRelatNo PROMPT '4444'
DEFINE BAR 3  OF popRelatNo PROMPT '3333'
DEFINE BAR 2  OF popRelatNo PROMPT '2222'
DEFINE BAR 1  OF popRelatNo PROMPT '1111'
DEFINE BAR 6  OF popRelatNo PROMPT '6666'
ACTIVATE POPUP popRelatNo 

SCROLL
Помещает правее создаваемого меню линейку прокрутки. Она отображается только в том случае, если все элементы не смогли поместиться в меню или если само меню не в состоянии поместиться в содержащем его основном окне Visual FoxPro или пользовательском окне.
SHADOW
Допустимо только в FoxPro для MS-DOS.
Делает затенение позади меню. Чтобы отобразить или убрать затенение меню, можно использовать команду SET SHADOWS. Подробнее об этом см. тему SET SHADOWS.
TITLE cMenuTitleText
Отображает заголовок в центре верхней границы меню. cTitleText задает текст заголовка меню.
COLOR SCHEME nSchemeNumber
Задает цвета для всех элементов меню. По умолчанию цвета меню, создаваемого с помощью команды DEFINE POPUP, контролируются цветовой схемой 2.
COLOR ColorPairList
Задает цвета для всех элементов меню.
Подробнее о цветовых схемах и цветовых парах см. тему Использование цветов.

Комментарии:
Чтобы задать положение группы элементов меню, используйте несколько команд DEFINE BAR. Для вставки в меню записей, файлов или полей пользуйтесь опциями PROMPT FIELD, PROMPT FILES и PROMPT STRUCTURE команды DEFINE POPUP.
Когда вы отображаете и активизируете меню с помощью команды ACTIVATE POPUP, вы можете выбрать один из его элементов. При этом, в зависимости от выбранного элемента, может быть выполнена некоторая подпрограмма или отображено и активизировано другое меню. Меню, которое отображается при выборе элемента меню, называется ниспадающим подменю. Подробнее о создании подменю см. в описании команды ON BAR.
Если вы для создания меню используете конструктор меню, вы можете вообще обойтись без этих команд. Конструктор меню автоматически генерирует команды, описывающие ваше меню. В конструкторе меню используется системное меню Visual FoxPro, которое вы можете модифицировать, добавляя свои элементы. Подробнее о создании меню см. тему Создание системы меню и главу 12 "Конструирование меню" Руководства разработчика.

Пример:

* В следующем примере команда DEFINE POPUP используется для
* создания меню, активизируемых при выборе заголовка меню в строке
* меню. Сначала текущая системная строка меню сохраняется в памяти с
* помощью команды SET SYSMENU SAVE, а затем все заголовки системных
* меню удаляются по команде SET SYSMENU TO.
* С помощью команды DEFINE PAD создаются два новых заголовка
* системных меню, а команда DEFINE POPUP создает раскрывающиеся
* меню для каждого из заголовков. Команда DEFINE BAR создает
* элементы в каждом из меню. Когда выбирается заголовок меню,
* команда ON PAD с помощью ACTIVATE POPUP активизирует
* соответствующее меню.
* Когда в меню выбирается элемент, команда ON SELECTION POPUP с
* помощью функций PROMPT( ) и POPUP( ) передает номер элемента и имя
* меню процедуре CHOICE. Эта процедура отображает текст выбранного
* элемента и имя содержащего его меню. Если выбрать элемент Exit в
* меню Card Info, восстанавливается первоначальная система меню Visual
* FoxPro.
*** Name this program DEFINPOP.PRG ***
CLEAR
SET SYSMENU SAVE
SET SYSMENU TO
DEFINE PAD convpad OF _MSYSMENU PROMPT '\<Conversions' COLOR SCHEME 3 ;
	KEY ALT+C, ''
DEFINE PAD cardpad OF _MSYSMENU PROMPT 'Card \<Info' COLOR SCHEME 3 ;
	KEY ALT+I, ''
ON PAD convpad OF _MSYSMENU ACTIVATE POPUP conversion
ON PAD cardpad OF _MSYSMENU ACTIVATE POPUP cardinfo
DEFINE POPUP conversion MARGIN RELATIVE SHADOW COLOR SCHEME 4
DEFINE BAR 1 OF conversion PROMPT 'Ar\<ea' KEY CTRL+E, '^E'
DEFINE BAR 2 OF conversion PROMPT '\<Length' ;
	KEY CTRL+L, '^L'
DEFINE BAR 3 OF conversion PROMPT 'Ma\<ss' ;
	KEY CTRL+S, '^S'
DEFINE BAR 4 OF conversion PROMPT 'Spee\<d' ;
	KEY CTRL+D, '^D'
DEFINE BAR 5 OF conversion PROMPT '\<Temperature' ;
	KEY CTRL+T, '^T'
DEFINE BAR 6 OF conversion PROMPT 'T\<ime' ;
	KEY CTRL+I, '^I'
DEFINE BAR 7 OF conversion PROMPT 'Volu\<me' ;
	KEY CTRL+M, '^M'
ON SELECTION POPUP conversion;
	DO choice IN definpop WITH PROMPT( ), POPUP( )
DEFINE POPUP cardinfo MARGIN RELATIVE SHADOW COLOR SCHEME 4
DEFINE BAR 1 OF cardinfo PROMPT '\<View Charges' ;
	KEY ALT+V, ''
DEFINE BAR 2 OF cardinfo PROMPT 'View \<Payments' ;
	KEY ALT+P, ''
DEFINE BAR 3 OF cardinfo PROMPT 'Vie\<w Users' ;
	KEY ALT+W, ''
DEFINE BAR 4 OF cardinfo PROMPT '\-'
DEFINE BAR 5 OF cardinfo PROMPT '\<Charges '
DEFINE BAR 6 OF cardinfo PROMPT '\-'
DEFINE BAR 7 OF cardinfo PROMPT 'E\<xit '
ON SELECTION POPUP cardinfo;
	DO choice IN definpop WITH PROMPT( ), POPUP( )
PROCEDURE choice
PARAMETERS mprompt, mpopup
WAIT WINDOW 'You chose ' + mprompt + ;
	' from popup ' + mpopup NOWAIT
IF mprompt = 'Exit'
	SET SYSMENU TO DEFAULT
ENDIF

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.