Создание и использование новых событий
Написание программ на VB "в классах" более хлопотно, требует более кропотливой разработки основания, на котором строится приложение. Зато последующая легкость поддержки , использование уже написанного кода, "структурность" позволяет наверстать потраченное время. Итак, сегодня я хочу рассказать вам о "искусственных" событиях(Events) , которые могут быть порождены в объектах и формах Вижуал Бэйсика. Еще раз напомню вам то, что уже говорил - программирование в классах использует тот же самый код, что и просто "линейное программирование" . Т.е. ничего нового в самом коде вам ждать не стоит. Надо просто его (код) правильно расположить и использовать. Рассмотрим задачу - Две формы, одна из которых показывается над другой, для выбора какой-либо справочной информации, или ввода значения пользователем. В обычной ситуации, вы вызываете вторую форму из первой таким образом: Form2.Show vbmodal Это вполне приемлемое решение, когда вы можете позволить себе показать вторую форму модально, т.е. заморозить все процессы на первой форме(за редким исключением, таким как таймер) . Однако не всегда есть такая возможность. Скажем, показ модальной формы в MDI проекте заморозит все дочерние формы, что не в какие ворота не лезет (опять таки, приходится к слову - создание "псевдомодального" окна в MDI, с использованием технологии написаниея классов, в виде примера (MDI_Lookup_Position.zip - вложенный файл) Что же мы можем противопоставить ситуации, когда первая форма просто тупо ожидает завершения работы второй? Мы можем использовать генерацию эвента непосредственно на первой форме. Withevents , Events() , аnd RiseEvents Давайте теперь разберемся, как будет работать вся схема: Проект состоит из 2 форм, и класса служащего своеобразным "буфером" Как же это все работает? Извлеките (test_events.zip - вложенный файл) действующий пример (для VB6) , откройте его и продолжим. На первой форме мы декларируем переменную заданного класса , причем декларируем WithEvents, что означает, что все эвенты этого класса будут происходить у нас на форме. Dim WithEvents LkBecheviar As CLookupBehaviour Сразу после этого в списке обьектов формы появится дополнительный обьект LbBehaviour , а в списке событий для этого обьекта появятся все обьявленные для этого обьекта события. Для нашего события это только WasChoise Далее на форме достаточно создать инстанс нашего класса, для дальнейшего использования: Set LbBehaviour = New CLookupBehaviour В коде класса, на событие Class_Initialize передаем созданный экземпляр класса второй форме, и, собственно, показываем форму. Set Form2.LkAnswer = Me Form2 содержит буквально пару строк кода - это обьявление ссылки на класс (заметьте, новый экземпляр не создается) Public LkAnswer As CLookupBehaviour а также реакцию на действия пользователя Private Sub Command1_Click() реакция простая - вызываем метод класса. Итак, как работает вся цепочка? Первая форма , при нажатии кнопки порождает экземпляр(инстанс) класса, причем класс этот в соотвествии с декларацией будет передавать свои события форме. В свою очередь, класс при рождении передает самого себя второй форме, и показывает ее. Уже в этот момент на первой форме может быть продолжены вычисления или процессы. Вы можете попробовать добавить их сами, после кода вызова класса. В качестве домашнего задания - попробуйте модифицировать код примера так, чтобы по истечении минуты вторая форма сама закрывалась. Сделайте это "насильно" с помощю таймера на первой форме и "добровольно" с помощью фоздания нового события(эвента) на второй форме
Страница сайта http://silicontaiga.ru
Оригинал находится по адресу http://silicontaiga.ru/home.asp?artId=6484 |