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

. Posted in Fox populi - Процедуры и функции

Как мы уже отмечали, 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). И еще комментарий, не нужно принимать этот пример в качестве оптимального решения. На самом деле все можно сделать куда более элегантнее, это всего лишь пример перехвата ошибки (реакции на ошибку) в процессе выполнения программы.

Форма элемент Вашего приложения

Форма это не программа. В старых версиях FoxPro существовало понятие экрана, то есть программы, строящей какое либо окно, набор окон или оформление экрана со всеми элементами управления. Такие программы автоматически создавались при построении проекта или с помощью команды Generate в меню. В любом случае, после изменения в образе этого экрана, Вы должны были снова сгенерировать экранную программу (файл SPR), чтобы изменения вступили в силу. Как уже отмечалось выше, Visual FoxPro это объектно-ориентированная среда, и здесь уже появляется понятие формы.

Форма это класс, позволяющий породить объект (окно, набор окон, панель управления), который начинает немедленно существовать (выполнятся, если угодно). В отличие от экранов, форма может быть запущена (выполнена) без дополнительной генерации программы, с помощью команды: DO FORM Соответственно, одна форма (класс) может породить несколько экземпляров (объектов), каждый из которых существует своей жизнью.

Формы это очень мощный инструмент инкапсуляции функциональных возможностей вашего приложения. Мы отдельно и подробно рассмотрим процесс построения форм и их использования в Вашем проекте, а пока просто немного информации для общего развития.

Итак, форма это не программа, а класс. Класс формы хранится в файле с расширением SCX (SCT дополнительный файл). Экземпляр формы создается командой DO FORM, при этом, соответственно выполняются события (методы) формы, которые возникают при ее загрузке. При выполнении формы (если это не указана специально) создается объектная переменная. Этим процессом можно управлять, указывая имя переменной в команде DO FORM:

* Объявим переменную для формы
public goMyForm
* Запустим форму, в переменной будет создан объект
DO FORM MyForm.scx NAME goMyForm
* а теперь закроем форму, обращаясь к ее методу
goMyForm.Release

Как мы покажем ниже, на самом деле формами управлять очень и очень просто. Ну а пока на этом все о формах.

 

Добавить комментарий


Защитный код
Обновить

Команды

Релиз Firefox 8, Thunderbird 8 и сопутствующих проектов Mozilla
Проект Mozilla официально представил релиз web-браузера Firefox 8.0, первый выпуск в рамках нового сокращенного цикла разработки, которому будет присвоен статус релиза с пр...14-11-2011

Хороший ход

События объекта Database Container
События объекта Database Container (DBC) предоставляют связь между событиями, написанными разработчиком, и активностью базы данных во время работы пользователя, такой как от...14-11-2011

Руководства

О правилах хорошего тона программирования на Лисе
1. Рекомендуется использовать на каждой рабочей станции копию Лисы. 2. Для ускорения необходимо разделить общедоступные базы и библиотеки. 3. Разделить функции для к...12-11-2011