Распечатать страницу

Создание меню средствами проектировщика в VFP

« Назад

Создадим меню, обеспечивающее вызов рассмотренных в гл. 10 форм.

На уровне Menu Bar (рис. 11.3) определим 2 подменю с заголовками "Формы" и "Взаимодействие форм" и одну вызываемую при выборе пункта "Закончить" процедуру со следующим кодом:

&& Процедура пункта "Закончить" проектируемого меню

release noFormsFound, aFormNames

set sysmenu to default        && Возвращаемся к системному меню

172.1.-Фрагмент-проектировщика-меню

Рис. 11.3. Фрагмент проектировщика меню

Смысл имеющихся в процедуре переменных noFormsFound, aFormNames поясним ниже.

Выделим подменю "Формы" и нажмем на кнопку в столбце Options. В появившемся диалоге (рис. 11.4) определим сочетание клавиш-ускорителей, раскрывающих это подменю, например Alt+F.

172.2.-Фрагмент-диалога-Prompt-Options

Рис. 11.4. Фрагмент диалога Prompt Options

Такое дополнение обязательно, поскольку заголовок подменю написан по-русски и при генерации меню в качестве ускорителя будут указаны для подменю "Формы" клавиши Alt+Ф, что недопустимо: наличие русской буквы в ускорителе вызовет ошибку.

Аналогичные действия проведем и в отношении иных пунктов рассматриваемого уровня меню.

Кроме того, в поле Skip For диалога Prompt Options укажем имя переменной noFormsFound. Ее эффект следующий: если значение noFormsFound равно .T., то подменю "Формы" окажется недоступным, и будет доступным – в противном случае.

Значение переменной noFormsFound мы определим в Setup-коде меню, выполняемом перед открытием меню.

Определенный в поле Message текст "Вызов пробных форм" будет появляться в статус-строке главного окна VFP при выборе подменю "Формы".

Вновь выберем подменю "Формы" и нажмем на кнопку Create (рис. 11.5).

172.3.-Создание-подменю-Формы

Рис. 11.5. Создание подменю "Формы"

В появившееся диалоге определим 3 команды (рис. 11.6), открывающие различные формы.

172.4.-Проектирование-подменю-Формы

Рис. 11.6. Проектирование подменю "Формы"

Посредством кнопки в столбце Option для каждой из команд определим в поле Skip For диалога Prompt Options условие ее недоступности (табл. 11.2).

Таблица 11.2

Skip For-выражения

Skip For-выражение

Пункт меню

aFormNames[1, 2]

Some Form

aFormNames[2, 2]

Next Form

aFormNames[3, 2]

Some Form Set

Чтобы пояснить смысл переменной noFormsFound и массива aFormNames рассмотрим Setup-код создаваемого меню. Окно редактирования этого кода открывается, когда активен проектировщик меню, в результате выбора в меню View – General Options, а затем в появившемся диалоге флажка Setup (рис. 11.7) и кнопки OK.

172.5.-Фрагмент-диалога-General-Options

Рис. 11.7. Фрагмент диалога General Options

В том же диалоге в группе переключателей Location, регулирующих статус и положение создаваемого меню относительно системного меню, выберем Replace (новое меню после открытия будет замещать системное).

Замечания.

  1. Для повторного открытия Setup-кода нужно в диалоге General Options ударить мышью по уже установленному флажку Setup и нажать затем на OK.

  2. Cleanup-код, также открываемый в диалоге General Options, предназначен для записи вызываемых в меню процедур, а также для кода, выполняемого после определения меню.

Назначение Setup-кода проектируемого меню в том, чтобы проверить, имеются ли на диске файлы открываемых форм. И если ни одного из файлов нет, то сделать недоступным подменю "Формы", присвоив для этого глобальной переменной noFormsFound значение .T. Если же хотя бы один из файлов имеется, то noFormsFound получит значение .F., на зато могут быть изменены значения второго столбца массива aFormNames, отвечающего за доступность пунктов подменю "Формы". Первый столбец этого массива содержит имена открываемых форм.

&& Setup-код меню

&&

clear

&&

#define PATH 'D:\'              && Путь к формам

#define EXT '.scx'               && Расширение файлов форм

#define NOFFORMS 3       && Число форм

&&

&& Переменные noFormsFound и aFormNames должны быть глобальными

public noFormsFound, aFormNames(NOFFORMS, 2)

&&

&& Инициализация первого столбца массива aFormNames

&& При создании все элементы массива равны .F.

aFormNames(1, 1) = 'SomeForm1'

aFormNames(2, 1) = 'NextForm1'

aFormNames(3, 1) = 'SomeFormSet'

&&

&& Число не найденных форм

notFound = 0

for ind = 1 to NOFFORMS

                                            if not File(PATH + aFormNames(ind, 1) + EXT) then

                                               && Форма не найдена; изменяем notFound и элемент массива

                                               notFound = notFound + 1

                                               aFormNames(ind, 2) = .T.

                                            endif

next

&&

&& Значение noFormsFound, отвечающее за доступность подменю "Формы"

noFormsFound = (notFound = NOFFORMS)

Созданные глобальные переменные noFormsFound и aFormNames будут освобождены при восстановлении системного меню (см. выше процедуру пункта "Закончить").

Сохраним меню в виде файла d:\SomeMenu.mnx; выполним генерацию меню (Menu – Generate) и запустим его, например в командном окне, на исполнение:

do d:\SomeMenu.mpr

Расширение в имени файла DO-команды, если запускается меню, обязательно. Причем указывается расширение MPR, поскольку им обладает созданный генератором меню файл.

Опробуем меню и выберем затем его пункт "Закончить".

Просмотрим теперь код в сгенерированном файле d:\SomeMenu.mpr меню (в приводимом коде частично опущен комментарий):

*       *

*       * This PROGRAM was automatically generated BY GENMENU

*       *

*       *   Setup Code

*       *

&&

&& См. приведенный выше Setup-код меню

&&

*       *

*       *   Menu Definition

*       *

set sysmenu to

set sysmenu automatic 

define pad _1gs1cql3z of _MSYSMENU prompt "Формы" color scheme 3 ;

                                            key ALT+F, "ALT+F" ;

                                            skip for noFormsFound ;

                                            message "Вызов пробных форм"

define pad _1gs1cql40 OF _MSYSMENU prompt "Взаимодействие форм" color scheme 3 ;

                                            key ALT+C, "ALT+C"

define pad _1gs1cql41 of _MSYSMENU prompt "Закончить" color scheme 3 ;

                                            KEY ALT+B, "ALT+B"

on pad _1gs1cql3z OF _MSYSMENU activate popup формы

on pad _1gs1cql40 OF _MSYSMENU activate popup взаимодейс

on selection pad _1gs1cql41 of _MSYSMENU ;

                                            do _1gs1cql42 ;

                                            in LocFile("d:\SomeMenu", "MPX;MPR|FXP;PRG", "Where is SomeMenu?") 

define popup формы margin relative shadow color scheme 4

define bar 1 of формы prompt "Some Form" skip for aFormNames[1, 2]

define bar 2 of формы prompt "Next Form" skip for aFormNames[2, 2]

define bar 3 of формы prompt "Some Form Set" skip for aFormNames[3, 2]

on selection bar 1 of формы do form d:\SomeForm

on selection bar 2 of формы do form d:\NextForm

on selection bar 3 of формы do form d:\SomeFormSet 

define popup взаимодейс margin relative shadow color scheme 4

define bar 1 of взаимодейс PROMPT "Панель инструментов"

define bar 2 of взаимодейс PROMPT "Две формы"

on selection bar 1 of взаимодейс do form d:\ListForm

on selection bar 2 of взаимодейс do form d:\FormOne

*       *

*       * _1GS1CQL42 ON SELECTION PAD

*       *

procedure _1gs1cql42

release noFormsFound, aFormNames

set sysmenu to default

Замечания:

1. Pad-имена пунктов меню могут быть заданы в диалоге Prompt Options (поле Pad Name). Тогда они заменят в MPR-файле автоматически генерируемые имена пунктов меню.

2. Имя файла с программой, выполняющей генерацию меню, хранит системная переменная _GENMENU.