Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по программированию. Visual C++, MFC, VB, ActiveX


Служба Рассылок Subscribe.Ru

Visual Basic. ActiveX. Уроки по программированию с сайта http://alexeev.nm.ru

Рассылка №26

Visual Basic. ActiveX. Урок 28. Добавляем событие.
Visual Basic. ActiveX. Урок 29. Вызываем событие в контейнере.
Visual Basic. ActiveX. Урок 30. Что такое бинарная совместимость.

Полные версии уроков (с картинками) можно найти по адресам
Урок 28. Добавляем событие.
Урок 29. Вызываем событие в контейнере.
Урок 30. Что такое бинарная совместимость.

Visual Basic. ActiveX. Урок 28. Добавляем событие

У компонентов ActiveX DLL (как, впрочем, и у ActiveX EXE) кроме свойств и методов могут быть еще и события. Когда наш компонент генерирует некоторое событие, то программа, в которой он был создан, может как-то на это событие реагировать. Это не должно быть для вас чем-то новым - скажем у кнопки есть событие Click, а что там программист в этом событии напишет - так это его личное дело.

Для добавления события в элемент ActiveX добавьте строчку

Option Explicit
 ...
Event TwoChanges()

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

Мы назвали событие TwoChanges(), и сделаем так, чтобы оно возникало при втором изменении переменной m_strMyString в нашем классе.

Событие у нас объявлено, но теперь его набо откуда-то вызвать. Делается это так. Заводим переменную для счетчика и обнуляем ее в событии Initialize:

Option Explicit
 ...
Dim m_intCounter As Integer
Private Sub Class_Initialize()
  m_intCounter = 0
End Sub

Увеличиваем значение счетчика при каждом изменении переменной m_strMyString:

Public Property Let MyString(NewString As String)
  m_strMyString = NewString
  m_intCounter = m_intCounter + 1
  If m_intCounter = 2 Then RaiseEvent TwoChanges
End Property
Public Sub SetString(NewString As String)
  m_strMyString = NewString
  m_intCounter = m_intCounter + 1
  If m_intCounter = 2 Then RaiseEvent TwoChanges
End Sub

Синтаксис здесь такой: для вызова события пишем RaiseEvent (это ключевое слово), после чего пишем имя вызываемого события (у нас это TwoChanges). У нас значение перемнной m_intCounter может изменяться в двух местах, поэтому и пишем наш код в двух местах. Правильнее надо бы его написать в отдельной функции, которую потом в двух местах вызвать. Но мы уж так написали, так пусть так и останется.

Компилируем и переходим к следующему уроку.

Наверх

Visual Basic. ActiveX. Урок 29. Вызываем событие в контейнере

Сейчас мы проверим событие из прошлого урока. Для этого создайте новый проект типа Standard EXE и добавьте на форму обычную кнопку. Далее подсоединяем наш AvtiveX DLL. Для этого заходим в меню Project и выбираем пункт References.

В появившемся окне References найдите в списке библиотек нашу (мы назвали ее MyFirstDLL). Если ее там нет, то вам придется воспользоваться кнопкой Browse. После подключения библиотеки добавьте следующий код:

Option Explicit
Dim WithEvents MyObject As CMyClass

Обратите внимание, что мы объявляем переменную MyObject с ключевым словом WithEvents. Также обратите внимание, что после этого в левом combobox'е для окна кода появится пункт MyObject, а в правом combobox'е для окна кода появится пункт со всеми событиями для нашего объекта MyObject (если вы, разумеется, выбрали в левом combobox'е MyObject).

Добавьте в программу следующий код:

Private Sub Form_Load()
  Set MyObject = New CMyClass
End Sub
Private Sub Command1_Click()
  'Изменяем значение строки в MyObject
  MyObject.SetString "Igor"
End Sub
Private Sub MyObject_TwoChanges()
  'Обрабатываем событие TwoChanges
  MsgBox "Произошло событие TwoChanges"
End Sub

Запускайте программу. Нажмите на кнопку два раза. При первом нажатии ничего не произойдет, при втором выскочит ожидаемый MessageBox.

Таким образом при втором изменении строки наш ActiveX DLL вызвал событие TwoChanges.

Наверх

Visual Basic. ActiveX. Урок 30. Что такое бинарная совместимость

Когда вы создаете элемент ActiveX, то при его модификации и перекомпиляции возможно возникновение проблем, связанных с различными его версиями. Одну из таких проблем мы сейчас и рассмотрим.

Создайте проект типа ActiveX DLL. В окно кода внесите только следующее объявление переменной:

Option Explicit
Public k As Integer

Мы не собираемся делать сложный класс, так что для пояснения проблемы хватит и этого. Измените также имя проекта на Compatibility и имя класса на CCompatibility (через окно свойств).

Зайдите теперь в меню Project, выберите пункт Compatibility Properties, и в появившемся диалоговом окне перейдите на вкладку Component.

Обратите внимание, что в этом окне отмечена радиокнопка Project Compatibility.

Закройте диалоговое окно, ничего в нем не меняя. Откомпилируйте наш ActiveX DLL. Создайте тестовый проект типа Standard EXE, добавьте ссылку на наш ActiveX DLL (если забыли, то смотрите урок 29).

В окно кода добавьте следующие строки:

Option Explicit
Dim objMyObject As New CCompatibility
Private Sub Form_Load()
  MsgBox objMyObject.k
End Sub

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

Теперь давайте изменим наш ActiveX DLL. Добавьте еще одну переменную:

Option Explicit
 ...
Public n As Integer

Откомпилируйте снова наш ActiveX DLL (под тем же именем). После этого запустите из окна Проводника откомпилированный тестовый проект test.exe. Должно возникнуть сообщение об ошибке.

Произошло следующее - в нашем тестовом exe-файле содержался некий уникальный идентификатор (так называемый GUID) для нашего старого ActiveX DLL. Когда мы создали новый вариант для нашего ActiveX DLL, то ему присвоился новый GUID, но в тестовом exe-файле остался старый! Отсюда и сообщение об ошибке.

Для того, чтобы избежать эту проблему, надо было отметить в окне Project Properties радиокнопку Binary Compatibility.

Если отмечена она, то при перекомпиляции элемента ActiveX (а это может быть любой ActiveX - и ActiveX Control, и ActiveX DLL, и ActiveX EXE) его GUID сохраняется, и таким образом старые проекты, котороые используют наш ActiveX, смогут работать как и прежде. Проблем не будет.

Наверх

Copyright Алексеев Игорь, 2002

Copyright cайт alexeev.nm.ru, 2002



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное