Основы языка Visual FoxPro

         

Реакция на события


Как мы уже отмечали, VFP реализует систему, управляемую событиями. Поговорим об этом более подробно. Первые языки программирования и первые подходы к программированию реализовали модель, управляемую данными. То есть программа чего-то там обрабатывала, и в зависимости от данных (исходных, вычисленных, сохраненных и проч.) выполняла тот или иной свой блок.

Характерным отличием такой модели является наличие алгоритма обработки, то есть четкой схемы, показывающей работу программы. К сожалению (или к счастью?) мир устроен по-другому. Динамичное развитие ситуации невозможно представить в виде законченных схем, блоков готовых решений. Мы не знаем, что случится через секунду или через минуту, мы также не знаем когда вообще что-нибудь случится. И, соответственно, мы не можем получить законченный алгоритм обработки.

Таким образом, мы приходим к понятию события. Событие это некоторое изменение окружающего нас мира. Событием может быть все что угодно, например (применимо к компьютеру), пользователь передвинул мышку, нажал кнопку, модем получил очередной байт или блок байтов, кто-то ломится к нам по сети, прошло столько-то секунд после какой-то команды и прочее.

Соответственно, суть системы управляемой событиями это описание реакции системы на определенные события. Нетрудно видеть, что алгоритма здесь нет, потому что мы не можем предсказать события. Мы можем лишь заявить следующее: "В случае того-то и того-то система поведет себя так-то и так-то". Таким образом, программирование системы заключается в описании реакции на события. Это очень важный момент в понимании подобных систем. Основное отличие от обычных подходов в том, что мы описываем только те события, которые нас интересуют, оставляя для остальных стандартную (ранее описанную) реакцию. То есть, если при создании обычных программ, Вы были обязаны описать все функциональные блоки Вашей программы, то в данном случае, Вы описываете лишь то, что отличает Вашу программу от стандартного поведения системы, как бы говоря: "А в остальном веди себя, как и прежде".


Кто и как расписал это "прежде" сейчас Вас не интересует, главное то, что программа может себя вести стандартным образом, пусть даже никак, весь пустая реакция это тоже реакция. Наиболее полно система, управляемая событиями, реализуется в объектной модели программирования, и мы рассмотрим ее позже, но в VFP есть еще несколько способов управлением реакцией на события. Первое, что необходимо знать, это понятие обработчика событий. Когда Вы отлаживаете Ваше приложение в среде VFP, или просто экспериментируете с VFP, Вам об этом заботиться не надо, так как сам VFP уже имеет свой обработчик событий, другое дело, когда стартует Ваше уже законченное приложение. Вы должны включить его при старте и выключить при окончании работы Вашего приложения. При всей своей сложности это делается весьма просто:

* Старт

READ EVENTS

* Завершение

CLEAR EVENTS

И все. Где именно это размещать мы покажем позже. А пока просто примите это к сведению.

Наиболее ярким примером средств управления событиями, за исключением классов, пожалуй, является меню VFP. Система программирования VFP является весьма мощной, настолько, что Вы всегда можете не просто создать меню в своем приложении, но и изменить, дополнить или кардинальным способом поменять меню самого VFP. Это делается с помощью команд управления меню, которых довольно много. Однако, к счастью, концепция RAD, и именно построитель меню позволяет Вам создать сложное, полнофункциональное меню, вообще не прибегая к написанию кода. Сам процесс построения меню мы рассмотрим позже, здесь лишь отметим, что его результатом обычно является полученная программа (файл с расширением *.MPR) , которая будучи однократно запущенной, довольно быстро завершит свое выполнение и начнет отслеживать события (мышку, горячие клавиши) как обычное Windows-меню.

Кроме этого примера, можно привести команды VFP ON :

ON KEY LABEL - отслеживает нажатия на клавиши или мышь

ON ERROR - отслеживает ошибки выполнения

Попробуйте следующее. В среде VFP в командном окне введите строку:



On error MessageBox( Ошибка! )

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

Функция LocFile() возвращает имя выбранного пользователем файла, но если пользователь отказывается от выбора, то происходит ошибка. Попробуем ее отследить:

local lcSelectedFile, llError, lcOnError

llError = .F.

lcOnError = ON("ERROR")

On Error llError = .T.

lcSelectedFile = locfile("readme.txt", "txt, me", "Файл")

On Error &lcOnError

if llError MessageBox("Файл не выбран")

else

Modify file (lcSelectedFile)

endIf

Комментарии к примеру: В переменной lcSelectedFile сохраняется полное имя выбранного файла, переменная llError сначала устанавливается в .F. и, в случае ошибки в .T., lcOnError сохраняет предыдущую установку ON ERROR, которая считывается функцией ON( ERROR ), восстанавливается установка макроподстановкой &lcOnError, файл открывается с помощью команды Modify file (lcSelectedFile). И еще комментарий, не нужно принимать этот пример в качестве оптимального решения. На самом деле все можно сделать куда более элегантнее, это всего лишь пример перехвата ошибки (реакции на ошибку) в процессе выполнения программы.


Содержание раздела