Создание и использование новых событий

Написание программ на VB "в классах" более хлопотно, требует более кропотливой разработки основания, на котором строится приложение. Зато последующая легкость поддержки , использование уже написанного кода, "структурность" позволяет наверстать потраченное время.

Итак, сегодня я хочу рассказать вам о "искусственных" событиях(Events) , которые могут быть порождены в объектах и формах Вижуал Бэйсика.

Еще раз напомню вам то, что уже говорил - программирование в классах использует тот же самый код, что и просто "линейное программирование" . Т.е. ничего нового в самом коде вам ждать не стоит. Надо просто его (код) правильно расположить и использовать.

Рассмотрим задачу - Две формы, одна из которых показывается над другой, для выбора какой-либо справочной информации, или ввода значения пользователем. В обычной ситуации, вы вызываете вторую форму из первой таким образом:

Form2.Show vbmodal

Это вполне приемлемое решение, когда вы можете позволить себе показать вторую форму модально, т.е. заморозить все процессы на первой форме(за редким исключением, таким как таймер) . Однако не всегда есть такая возможность. Скажем, показ модальной формы в MDI проекте заморозит все дочерние формы, что не в какие ворота не лезет (опять таки, приходится к слову - создание "псевдомодального" окна в MDI, с использованием технологии написаниея классов, в виде примера (MDI_Lookup_Position.zip - вложенный файл) Что же мы можем противопоставить ситуации, когда первая форма просто тупо ожидает завершения работы второй?

Мы можем использовать генерацию эвента непосредственно на первой форме.
Что нам для этого нужно? Первое, как обычно, необходимо познакомится с материалом по справочнику или хелпу VB
Нам потребуются команды

Withevents , Events() , аnd RiseEvents

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

Проект состоит из 2 форм, и класса служащего своеобразным "буфером"

Как же это все работает? Извлеките (test_events.zip - вложенный файл) действующий пример (для VB6) , откройте его и продолжим.

На первой форме мы декларируем переменную заданного класса , причем декларируем WithEvents, что означает, что все эвенты этого класса будут происходить у нас на форме.

Dim WithEvents LkBecheviar As CLookupBehaviour

Сразу после этого в списке обьектов формы появится дополнительный обьект LbBehaviour , а в списке событий для этого обьекта появятся все обьявленные для этого обьекта события. Для нашего события это только WasChoise
В коде класса необходимо иметь хотябы один эвент, иначе при компиляции проекта, имеющего ссылку на обьект withevents вы получите сообщение об ошибке.

Далее на форме достаточно создать инстанс нашего класса, для дальнейшего использования:

Set LbBehaviour = New CLookupBehaviour

В коде класса, на событие Class_Initialize передаем созданный экземпляр класса второй форме, и, собственно, показываем форму.

Set Form2.LkAnswer = Me
Form2.Show

Form2 содержит буквально пару строк кода - это обьявление ссылки на класс (заметьте, новый экземпляр не создается)

Public LkAnswer As CLookupBehaviour

а также реакцию на действия пользователя

Private Sub Command1_Click()
LkAnswer.ButtonPress Text1.Text
Unload Me
End Sub

реакция простая - вызываем метод класса.

Итак, как работает вся цепочка?

Первая форма , при нажатии кнопки порождает экземпляр(инстанс) класса, причем класс этот в соотвествии с декларацией будет передавать свои события форме.

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

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

 


Страница сайта http://silicontaiga.ru
Оригинал находится по адресу http://silicontaiga.ru/home.asp?artId=6484