Способы объявления событий классов
Раннее связывание осуществляется при объявлении объектной переменной с явным указыванием имени класса. Например,
Dim Obj1 As New Form1
Dim Obj2 As New Class1
Dim ObjWord As New Word. Application
Dim ObjExcel As New Excel. Application
Dim ObjAccess As New Access. Application
Раннее связывание происходит на этапе компиляции и выполняется быстрее. При раннем связывании перед написанием кода необходимо загрузить в память библиотеку с классом, используя команду ProjectReferences, окно References и список Available References. После чего следует приступать к созданию объектной переменной (уже определенного класса) с ключевым словом New.
Если же при объявлении объектной переменной используется универсальный тип Object, Variant, Control, то VB осуществляет позднее связывание переменной с объектом. Например,
Dim mObject As Object, Obj As Control
For Each Obj In Me. Controls
If TypeName(Obj) = "TextBox" Then Obj. BackColor = 0
Next
Set mObject=CreateObject(“Word. Application”) ‘Установить связь
………………………………………………………
Set mObject=Nothing ‘Разорвать связь объекта с приложением Word
Set mObject=CreateObject(“Excel. Application”) ‘Установить связь
………………………………………………………
Set mObject=Nothing ‘Разорвать связь объекта с приложением Excel
Позднее связывание оправдано тогда, когда невозможно заранее определить, какие типы объектов будут использоваться при выполнении программы, что требует дополнительных затрат времени на анализ допустимых объектов. При первом обращении к свойствам и методам объекта происходит событие Initialize – создание объекта, а в строке Set mObject=Nothing наступает событие Terminate – уничтожение объекта и освобождение памяти.
К недостаткам раннего связывания можно отнести привязанность создаваемого Вами приложения к конкретной версии библиотеки объектов. Выход в свет новой версии продукта, объектную модель которого Вы используете посредством раннего связывания, приведет к необходимости обновления Вашего приложения. К достоинству раннего связывания можно отнести способность отображать список свойств и методов объекта после ввода точки при написании кода. Обычно раннее связывание используется на стадии отладки приложения. Завершающая стадия разработки приложения осуществляется обычно на основе позднего связывания, не зависящего от новых версий используемых в проекте объектных моделей.
7. Способы объявления событий классов. Примеры.
Каждый класс кроме свойств и методов имеет набор собственных событий. События – это реакция объекта на действие системы, пользователя и других приложений. События, определяемые пользователем, могут объявляться как внутри модуля класса (в области GD окна Code класса) с помощью команды FileNewEvent или кнопки окна Class Builder, так и внутри модуля формы одним и тем же оператором Event. Параметры, передаваемые процедуре события, должны быть указаны в той же строке объявления события. Например,
Public Event WWW()
Public Event XXX(ByVal A As Long, ByVal B As Long)
Для генерации (выполнения) события предназначен оператор RaiseEvent, которому в качестве параметра передается имя события. Например,
Public Sub Text1_Change()
RaiseEvent WWW ‘Реализация события WWW
End Sub
Public Sub Command1_Click()
RaiseEvent XXX(500,300) ‘Реализация события XXX
End Sub
Контейнер (модуль класса или формы), в котором используется объект, должен содержать процедуры-события.
Пример 59. Объявить событие в модуле класса, а запрограммировать его в модуле формы.
Пусть событие (назовем его MTS) имеет два параметра. Первый – числовой, второй – логический. Событие будет реализовываться в методе Long1. Выполните следующие действия.
· Создайте новый проект с шаблоном Standard EXE.
· С помощью команды ProjectAdd Class Module добавьте модуль класса с именем Class1 в проект, используя шаблон Class Module на закладке New.
· Поместите в него следующий код.
Public Event MTS(ByVal Percent As Single, ByRef Cancel As Boolean)
Public Sub Long1(ByVal f As Single, c As Boolean)
RaiseEvent MTS(f, c) ‘Вызов события MTS с двумя параметрами
End Sub
· Теперь добавьте в область GD окна Code модуля формы следующий код:
Private WithEvents mW As Class1, nCancel As Boolean, r As Single
‘Ключевое слово WithEvents означает, что объект mW содержит события
Private Sub Command1_Click()
nCancel = False
r = Rnd
Set mW = New Class1 ‘Создание нового объекта на основе класса
Call mW. Long1(r, nCancel) ‘Обращение к методу Long1
Text2 = nCancel ‘Выводим значение, возвращаемое из события
Set mW = Nothing
End Sub
Private Sub Form_Load()
Text1 = Format(r, "0 %")
Text2 = ""
End Sub
Private Sub mW_MTS(ByVal Percent As Single, _
Cancel As Boolean)
m% = CInt(100 * Percent)
Text1 = m & "%"
If m >= 50 Then Cancel = True
End Sub
8. Создание элемента управления ActiveX в Visual Basic. Отображаемые и пользовательские свойств и методы ActiveX-компонент. Передача события приложению–контейнеру. Регистрация компонент.
Конструирование элемента управления ActiveX
Возможность создания независимых ActiveX-компонент подобно элементам управления, представленным на панели General ToolBox, и последующее их использование в любых разрабатываемых приложениях привлекает всех без исключения разработчиков. С помощью VB можно легко создать элемент управления ActiveX. Кроме того, созданный нами ActiveX-компонент можно будет использовать на Web-страницах Internet – одной из самых быстрорастущих информационных систем.
Как известно, стандартное приложение содержит главную форму и несколько вспомогательных форм. Вспомогательные формы обычно поддерживают главную, получают данные, вводимые пользователем (например, InputBox), и обрабатываются кодом своей или главной формы. Поэтому по аналогии можно предположить, что элемент управления ActiveX является главной формой, а страницы его свойств – вспомогательными формами.
Конструирование элемента управления ActiveX похоже на конструирование формы и выполняется разработчиком (конструктором) элемента. При этом элемент располагается на объекте, называемом UserControl, являющемся для него формой. Объект UserControl имеет те же методы, что и стандартная форма, например, Print, Line и др.
Как известно, форма приложения является окном, которое находится на рабочем столе при выполнении приложения. Элемент управления ActiveX – это то же окно, но он может существовать только на форме.
Как известно, приложение взаимодействует с пользователем через свой интерфейс. Разработчик приложения (программист, который использует элемент) решает, как оно будет вести диалог с пользователем, и пользователю приложения приходится следовать этим правилам. Подобное же происходит и с элементом управления ActiveX. Он предоставляет строго определенный интерфейс из свойств, событий и методов. При этом разработчик приложения получает доступ к элементу только через его интерфейс и также как пользователь приложения не может модифицировать исходный код элемента ActiveX.
Код элемента управления ActiveX работает в режиме конструирования и выполнения. Когда разработчик приложения помещает элемент управления на форму, то запускается программный код элемента ActiveX. Когда изменяются его свойства с помощью окна свойств, то с ним также что-то происходит на форме. Когда же разработчик запускает приложение, то элемент (уже объект формы) также выполняет какие-то действия. Но при этом в зависимости от режима работы элемент определяет как он должен себя вести.
Например рассмотрим элемент TextBox. Если в режиме конструирования через окно свойств установить присваиванием Scrollbar= Vertical, то к объекту на форме автоматически будет добавлена вертикальная полоса прокрутки. Причем она будет оставаться в поле в обоих режимах работы. Как Вы уже должны заметить, свойство Text имеет по умолчанию значение Text1. Запустив приложение и введя некоторый текст в поле объекта, Вы измените его значение. Однако если вновь вернуться в режим конструирования, то это свойство вновь примет значение Text1. То есть изменения, произведенные в окне свойств элемента, участвуют в обоих режимах.
При конструировании же элемента управления ActiveX разработчику приходится переключаться между функциями разработчика элемента и функциями разработчика приложения. При этом разработчик элемента определяет, какие свойства, события и методы должны быть доступны в каждом из этих режимов. Например, для разработчика элемента могут быть доступны свойства как для чтения, так и для изменения, а для разработчика приложения – только для чтения. Также разработчик элемента может быть определить дополнительные методы и события, недоступные для разработчика приложения.
Разработчик элемента управления ActiveX конструирует его видимый интерфейс (размещением каких-либо элементов) на объекте UserControl и может манипулировать им через свойства. Этот процесс похож на создание интерфейса у обычного приложения. Конструирование же невидимого интерфейса (свойств, методов и событий) во многом похоже на конструирование модуля класса.
Как известно, любой элемент ActiveX должен предоставлять определенные свойства, которые будут автоматически отображаться в окне свойств. Также разработчики приложений ожидают увидеть у элемента управления не только уникальные свойства, но и стандартные свойства, присущие всем стандартным элементам (такие как цвет фона, шрифт текста, видимость и т. д.). Разрабатываемые же методы должны обеспечивать все функциональные возможности элемента управления и быть доступными из кода приложения. И наконец, нужно предусмотреть события, необходимые для реакции на внешние воздействия.
И так, прежде чем начать кодировать элемент управления, Вы должны сформулировать для себя, что будет делать элемент и как он будет использоваться разработчиками приложений.
Теперь начнем наше конструирование элемента ActiveX. Создадим элемент управления FlexShape (улучшенный элемент управления Shape). Он будет реализовать некоторые возможности элемента управления Shape плюс отображение звезды и эллипса.
Надо сразу сказать, что большая часть функциональных возможностей для создаваемого (конструируемого) элемента управления уже разработана и нам лишь остается воспользоваться способом заимствования их из других элементов с помощью мастера VB, который будет генерировать код стандартных частей для создаваемого элемента управления, а разработчику только останется написать код для уникальных (дополнительных) свойств, методов и событий.
• Откройте новый проект с шаблоном ActiveX Control или воспользуйтесь командой FileNew ProjectActiveX Control. VB подготовит «сцену» для нового элемента управления ActiveX, создав новый проект под названием Project1 с объектом UserControl1. UserControl – это аналог формы, на которой конструируется элемент управления.
• Используя свойства Name, переименуйте проект и элемент управления. Эти два имени будут использованы для регистрации данного элемента в системе, поэтому они должны быть содержательными. Имя Project1 измените на FlexProject, а имя UserControl1 – на FlexShape (рис.123). Теперь запустим мастер, чтобы он сгенерировал за нас как можно больше стандартного кода для создаваемого элемента управления.
• С помощью команды Add-InsAdd-In Manager … загрузите мастер ActiveX Ctrl Interface Wisard (можно двойным щелчком) и выполните одноименную команду из меню Add-Ins. Проследуем за мастером по шагам весь путь по созданию кода.
• На первом шаге мастер пригласит Вас к началу процесса конструирования интерфейса. Его появление можно отключить флажком «Skip this screen in future». Однако сейчас нажмите кнопку Next.
• На втором шаге мастер предложит выбрать стандартные части элемента управления ActiveX. Слева – список стандартных свойств, методов и событий, которые можно включить в конструируемый элемент. Справа – список уже выбранных свойств, методов и событий интерфейса, которые создаваемый элемент управления будет поддерживать. Здесь можно любой из элементов списка убрать или добавить. Добавьте в список справа следующие свойства, события и методы, коротые характерны для большинства элементов управления: Click, Cls, DblClick, Enabled, ForeColor, BackColor, Hide, Hdc, Hwnd, MouseMove, MouseUp, MouseDown, OLEDrag, OLEDragOver, OLEDragDrop, OLEDropMode, OLEStartDrag, Paint, Picture, Resize, ScaleHeight, ScaleWidth, Show, Refresh.
• На третьем шаге происходит создание специальных частей интерфейса (рис.124), которые являются уникальными для данного элемента управления. Create Custom Interface Members (Создание пользовательских членов интерфейса) мастер предоставляет возможность программисту работать с пользовательскими событиями, методами и свойствами.
Для этого достаточно нажать кнопку New, чтобы отобразить диалог Add Custom Member и ввести название свойства, метода или события. Добавьте следующие свойства: x, y, Rmax, Rmin, AngleTopBase, N, Shape, FigureStyle, AutoSize и методы Zvezda, Ellipse. Кнопками Edit и Delete можно отредактировать или убрать компонент интерфейса.
• На четвертом шаге происходит установка соответствия (отображения) между компонентами интерфейса создаваемого элемента и стандартными элементами VB (рис.)
Все те компоненты, которые Вы не желаете обрабатывать собственным кодом, следует сделать соответствующими компонентам объекта UserControl. Такими компонентами являются все, кроме x, y, Rmax, Rmin, AngleTopBase, N, Shape, FigureStyle, AutoSize, Zvezda, Ellipse. Так, например, для события Click нет необходимости определять реакцию на щелчок внутри создаваемого элемента, а нужно передать это событие главному приложению, чтобы оно обработалось им стандартно. (((Четвертый шаг Set Mapping (Установить соответствие) мастера ActiveX Control Interface Wizard (рис. 14.9) связывает члены элемента управления, выбранные на втором и третьем шагах, с событиями, свойствами и методами объектов элемента управления ActiveX. Диалоговое окно мастера содержит список всех свойств, методов и событий, которые определены как часть общего интерфейса элемента управления. Для связывания члена, выбранного из списка Public Name (Наименование), необходимо из раскрывающегося списка Control (Объект элемента управления) группы Maps to (Отобразить на) выбрать объект элемента управления и из списка Member (Член) этой же группы соответствующее событие, свойство или метод.)))
• Для отображения компонентов создаваемого интерфейса необходимо попеременно их выбирать из списка Public Name и связывать через список Control с элементом UserControl. Мастер сам подберет компонент интерфейса объекту UserControl с тем же именем в отображаемом ниже списке Member.
• ((((На пятом шаге Set Attributes (Назначить атрибуты) (рис. 14.10) мастер предлагает определить атрибуты тех членов нового элемента управления ActiveX, которые не были связаны с событиями, методами и свойствами на предыдущем шаге.))) На пятом шаге происходит установка типов свойств, значений по умолчанию и атрибутов для новых компонент (рис.126). По умолчанию мастер объявляет все новые свойства как Variant. Здесь же можно добавить описание (поле Description) к каждому компоненту интерфейса. Каждое описание отобразится внизу окна свойств, когда пользователь выберет свойство. Стандартные элементы уже имеют описания, а для пользовательских свойств их необходимо составить.
• Задайте для свойств x, y, Rmax, Rmin, AngleTopBase тип Integer, для свойств FigureStyle, N, Shape – тип Byte, для свойства AutoSize – тип Boolean, а для методов Zvezda, Ellipse – тип Variant. Как будет показано ниже, можно назначить некоторым свойствам пользовательский тип данных.
• В поле Default Value можно установить значение свойств по умолчанию. Установите для новых свойств следующие значения: x=1000, y=1000, Shape=0, Rmax=300, Rmin=100, AngleTopBase=90, FigureStyle=1, N=5, AutoSize=False. Таблица 35
Компонента |
Описание |
X и Y |
X, Y – центр фигур |
AngleTopBase |
Угол базовой вершины звезды или угол между Rmax и осью х для эллипса |
Rmax, Rmin |
Наружный и внутренний радиусы звезды или максимальный и минимальный радиусы эллипса |
N |
Количество вершин звезды |
Zvezda |
Рисуем звезду |
Ellipse |
Рисуем эллипс |
Shape |
Выбор фигуры (0–звезда, 1–эллипс, 2–круг) |
• В поле Arguments можно указать параметры для методов и событий. Наш проект не будет иметь собственных событий и аргументов у методов (как в предыдущем параграфе).
• Два списка Run Time и Design Time позволяют определить свойства для режима выполнения и режима конструирования.
• Последний шаг – это завершение (кнопка Finish), при этом оставьте отмеченным флажок View Summary Report, чтобы мастер показал итоговый отчет по завершении своей работы. Элемент управления FlexShape создан, теперь можно приступить к его испытанию. Элемент управления имеет собственную страницу свойств и может быть помещен на форму, но пока на экране нет ничего, кроме объекта UserControl. Появился новый значок на панели элементов управления с именем FlexShape. Значок с изображением матрицы и ручки по умолчанию дается всем элементам управления ActiveX. Для того чтобы поменять значок, можно либо нарисовать новую картинку (Bitmap-растр) в редакторе картинок, например, Imagedit. exe, либо загрузить с диска готовую картинку, например, по маршруту C:InstallVisual Basic 6.0COMMONGRAPHICS BITMAPS, и связать ее со свойством ToolBoxBitmap объекта UserControl.
Удостоверимся, что элемент управления работает. Значок элемента ActiveX заблокирован, поскольку сам элемент все еще конструируется.
Следующие шаги являются обязательными всякий раз, когда конструируется элемент управления ActiveX.
• Выберите команду Add Project из меню File, чтобы открыть новое окно проекта.
• Выберите шаблон проекта Standard EXE. Появится новая форма с именем Form1. Измените имя формы, например, на FlexForm, а имя нового проекта – на MyProject.
• Закройте окно конструирования UserControl и окно с кодом элемента управления, если они были открыты.
• При активной форме FlexForm значок на панели элементов управления General ToolBox становится также активным. С этого момента можно использовать элемент управления FlexShape, как любой другой элемент управления VB.
• Поместите объект FlexShape на форму FlexForm. Он автоматически получит имя FlexShape1.
• Нажмите на панели инструментов Standard кнопку Save Project Group () и сохраните компоненты на диске в виде файлов FlexShape. ctl, FlexProject. vbp, FlexForm1.frm, MyProject. vbp.
Итак, VB сделал за нас довольно много работы. Он сгенерировал работающий элемент управления ActiveX, создав стандартный код интерфейса.