Шаг 3 - Событийная модель VFP

Многие программисты сломали зубы об эту модель, а некоторые программисты, эти, свои поломанные зубы, так и не починили...

А все очень просто:

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). Между ними программист может создавать свою функциональность. Приятно всегда найти выход из программы в меню Файл последним пунктом, а не в другом месте.

А если пункт меню заканчивается многоточием (...), то следует ожидать появление диалогового окна.

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


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