Многие программисты сломали зубы об эту модель, а некоторые программисты, эти, свои поломанные зубы, так и не починили...
А все очень просто:
1. Старт программы 2. Начальные установки 3. Определение системного меню --> Главное меню программы 4. READ EVENTS Команда меню 1 --> процедура (функция) Команда меню 2 --> процедура (функция) Команда меню 3 --> процедура (функция) Команда меню 4 --> процедура (функция) Команда меню 5 --> процедура (функция) Команда меню 6 --> процедура (функция) 3. CLEAR EVENTS <-- Команда меню Exit (Выход) 2. Завершающие установки 1.Выход из программы
И вся модель !!! После определения меню мы "завешиваем" систему. На команды меню "цепляем" наши процедуры и функции. Получаем нелинейную структуру, которая, кроме всего прочего, легко наращивается и дополняется. Просто добавляем пункт меню и вызов новой процедуры.
Очень важно не забыть пункт меню, вызывающий процедуру с командой CLEAR EVENTS. Иначе наше приложение придется снимать диспетчером задач вместе с FoxPro.
А теперь завершим создавать "скелет" нашего приложения. Добавим в проект файл DefineMenu.prg. Не забудем расположить его в папке Programs(не путать с закладкой Programs).
* * function DefineMenu * * отключаем системное меню VFP set sysmenu off * переопределяем системное меню VFP define menu _MSYSMENU bar in screen * определяем горизонтальную строчку меню define pad PADFILE of _MSYSMENU prompt "Файл" define pad PADEDIT of _MSYSMENU prompt "Правка" define pad PADWIN of _MSYSMENU prompt "Окно" define pad PADHELP of _MSYSMENU prompt "Помощь" * определяем вызовы вертикальных меню on pad PADFILE of _MSYSMENU activate popup POPFILE on pad PADEDIT of _MSYSMENU activate popup POPEDIT on pad PADWIN of _MSYSMENU activate popup POPWIN on pad PADHELP of _MSYSMENU activate popup POPHELP * определяем меню ФАЙЛ define popup POPFILE margin relative define bar 1 of POPFILE prompt "Новый..." define bar 2 of POPFILE prompt "Открыть..." define bar 3 of POPFILE prompt "\-" define bar 4 of POPFILE prompt "Выход" * определяем вызовы процедур для пунктов меню on selection bar 1 of POPFILE do PopFileNew on selection bar 2 of POPFILE do PopFileOpen on selection bar 4 of POPFILE do PopFileExit * * И так далее, пока раджа не крикнет "ДОВОЛЬНО!!!" ("Золотая антилопа"). * * активизируем наше меню set sysmenu automatic * конец процедуры return *Добавляем в проект файл PopFileExit * * function PopFileExit * CLEAR EVENTS return *Добавляем в проект файлы PopFileNew и PopFileOpen * * function PopFileNew * getfile() * return *В главный модуль приложения MyMain добавляем несколько строк * вызов процедуры определения меню DefineMenu() * обработчик событий READ EVENTS * восстановление системного меню VFP set sysmenu to default * конец процедуры return *
Можно сохранять код и запускать приложение. Подсвечиваем курсором MyMain и нажимаем кнопку Run. Приложение успешно "висит" и выйти из него можно только выбрав команду Выход в меню Файл.
Несколько замечаний по поводу программирования на VFP. Если программный код расположен в отдельном файле, то для вызова используется имя файла. Строчка function NameFunction не нужна или должна быть закоментирована символом *. Много маленьких процедур можно собрать в главном модуле:
* * главный модуль * .................................. * READ EVENTS * ................................. * * конец главного модуля * return * function MyFunction1 return * function MyFunction2 return *Функции в главном модуле приложения VFP находит сам. Если несколько функций собрано по смыслу в нескольких процедурных файлах необходимо использовать следующую команду:
Do MyFunction in MyProcedureFileТеперь об интерфейсе. Существуют стандарты, которых следует придерживаться. Первыми в главном меню программы всегда следуют пункты Файл (File) и Правка (Edit), последними - Окно (Window) и Помощь (Help). Между ними программист может создавать свою функциональность. Приятно всегда найти выход из программы в меню Файл последним пунктом, а не в другом месте.
А если пункт меню заканчивается многоточием (...), то следует ожидать появление диалогового окна.
Предлагаю самостоятельно посмотреть в документации вопросы определения "горячих клавиш" и создания сообщений для меню.