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

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


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

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

Рассылка №17

Visual Basic. ActiveX. Урок 13. Использование Control Interface Wizard
Visual Basic. ActiveX. Урок 14. Анализ кода Control Interface Wizard
Visual Basic. ActiveX. Урок 15. Дополняем код Control Interface Wizard'а

Visual Basic. ActiveX. Урок 13. Использование Control Interface Wizard

В этом уроке мы посмотрим, как использовать Control Interface Wizard. Эта утилита предназначена для построения заготовок для ActiveX-элементов. В этом уроке мы сделаем ActiveX, который будет запоминать, сколько раз на нем щелкнули. При первых трёх щелчках будет возникать событие Click, при дальшейших щелчках - NoClicks (последнее событие определено нами). Из свойств мы добавим свойство Clicks, которое будет считать число щелчков на нашем элементе. Это свойство на этапе времени выполнения будет доступно только для чтения. И, наконец, из методов мы добавим метод SetZero, который будет обнулять число щелчков. Таким образом мы с помощью мастера добавим и свойство, и метод и событие.

Запускаем Visual Basic. По умолчанию эта утилита не запущена. Для запуска выберите меню Add-Ins.

В появившемся диалоге Add-Ins Manager выберите VB 6 ActiveX Ctrl Interface Wizard.

Поставьте галочку рядом с Loaded/Unloaded. При желании можете поставить и галочку Load on Startup (если хотите, чтобы этот мастер загружался каждый раз вместе с Visual Basic).

После нажатия на OK в меню Add-Ins появится пункт ActiveX Control Interface Wizard.

Выберите этот пункт меню. Появится мастер. Первый экран можете прочитать, а можете и не читать (ничего особо интересного там нет, так что в нем можно сразу поставить галочку Skip this screen in the future). Нажимаем Next. Появится экран мастера, в котором Вы должны задать, какие свойства, методы и события будут в вашем ActiveX элементе из стандартных.

Часть из них уже по умолчанию включена в ваш ActiveX (они находятся в правом списке). Если вы хотите что-нибудь добавить или убрать, то понажимайте на кнопочки < и >. Нажимаем Next. Появляется следующее окно. В нем мы добавляем для нашего ActiveX нестандартные свойства, методы и события. Для их добавления нажмите на кнопку New.

Появится окно Add Custom Member.

Давайте в нем добавим свойство Clicks, метод SetZero и событие NoClicks, после чего нажмите OK. В окне мастера должны появится введенные вами методы, свойства и события.

Опять нажимаем на Next. В следующем окне мастера нам придется остановиться. В нем мы должны определить, какие из свойств, методов и событий нашего ActiveX будут проектироваться на стандартные свойства UserControl'а (того, который служит базой для нашего элемента ActiveX). В большинстве случаев рекомендуется действовать так - выделить в левом списке всё, кроме добавленных нами свойств, событий и методов, затем в ComboBox Control выбрать UserControl. Но мы в целях эксперимента будем действовать не так. Указанную процедуру мы применим только для элементов списка Click, MouseDown, MouseMove, MouseUp. Потом посмотрим, на что повлияет наш выбор. Итак, выделите слева указанные элементы списка и выберите справа UserControl.

Нажмите Next. В следующем окне мастера нам надо задать различные параметры для свойств, методов и событий нашего ActiveX. Для свойства Clicks выберите тип Integer, значение по умолчанию 0, и определите, что во время выполнения это свойство доступно только для чтения.

Для метода SetZero установите тип возвращаемого значения в Variant. Это будет означать, что метод этот будет процедурой (если тип возвращаемого значения не Variant, то это будет функцией).

После этого нажимаем на Finish, затем читаем Summary и переходим к следующему уроку. Там мы уже будем разбираться с тем, что нам мастер написал.

Наверх

Visual Basic. ActiveX. Урок 14. Анализ кода Control Interface Wizard

Продолжаем прошлый урок. Давайте посмотрим, что за код породил мастер.

Следующие строки говорят нам о том, что в нашем ActiveX-элементе будут события Click, KeyDown, KeyPress и KeyUp (именно их мы и указали в Control Interface Wizard):

...
Event Click() 'MappingInfo=UserControl,UserControl,-1,Click
Event KeyDown(KeyCode As Integer, Shift As Integer) 'MappingInfo=UserControl,UserControl,-1,KeyDown
Event KeyPress(KeyAscii As Integer) 'MappingInfo=UserControl,UserControl,-1,KeyPress
Event KeyUp(KeyCode As Integer, Shift As Integer) 'MappingInfo=UserControl,UserControl,-1,KeyUp
 ...

Вспомним, что указанные события нашего ActiveX мы отобразили на события UserControl. Это видно из сторок (и подобных им):

Private Sub UserControl_Click()
  RaiseEvent Click
End Sub

Далее мы определили собственное событие NoClicks. Оно тоже имеется:

...
Event NoClicks()
 ...

Определённые на первом шаге мастера стандартные свойства BackColor, ForeColor, Enabled, Font и т. п. тоже присутствуют в нашем коде. Для каждого из них присутствует два метода - Property Get и Property Let (или Property Set для свойств-объектов типа Font), которые связывают наше свойство с соответствующей внутренней переменной. Например, для свойства BackColor мы имеем следующие строчки:

Public Property Get BackColor() As Long
  BackColor = m_BackColor
End Property

Public Property Let BackColor(ByVal New_BackColor As Long)
  m_BackColor = New_BackColor
  PropertyChanged "BackColor"
End Property

а для Font - следующие:

Public Property Get Font() As Font
  Set Font = m_Font
End Property

Public Property Set Font(ByVal New_Font As Font)
  Set m_Font = New_Font
  PropertyChanged "Font"
End Property

Кроме того мы определили свойство Clicks. Оно тоже присутствует в порожденном коде:

Public Property Get Clicks() As Integer
  Clicks = m_Clicks
End Property

Public Property Let Clicks(ByVal New_Clicks As Integer)
  If Ambient.UserMode Then Err.Raise 382
  m_Clicks = New_Clicks
  PropertyChanged "Clicks"
End Property

Обратите внимание на строчку:

...
If Ambient.UserMode Then Err.Raise 382
 ...

Она говорит о том, что если мы находимся в режиме работы программы, то при попытке изменить значение свойства возникает ошибка с номером 382 (property cannot be set at run time). Как вы помните, это свойство при запуске программы мы сделали Read-Only.

Теперь о нашем собственном методе SetZero. Для него Control Interface Wizard вставил только заготовку (естественно, ведь что за код там должен быть, знаем только мы сами):

Public Function SetZero() As Variant

End Function
Наверх

Visual Basic. ActiveX. Урок 15. Дополняем код Control Interface Wizard'а

Теперь мы будем вносить в наш код дополнения. И это естественно - мастер пособен лишь на написание заголовок для наших функций. А всю начинку нам надо писать самим.

Напомним, что мы хотели, что бы наш ActiveX действовал так - при трех щелчках возникает событие Click, а при последующщих - NoClick. Для этого давайте изменим порожденный мастером код для UserControl_Click на следующий:

Private Sub UserControl_Click()
  m_Clicks = m_Clicks + 1
  If m_Clicks <= 3 Then
    RaiseEvent Click
  Else
    RaiseEvent NoClicks
  End If
End Sub

Теперь у нас возникает или событие Click, или NoClick, в зависимости от того, сколько раз мы уже щелкнули (количество щелчков хранится в переменной m_Clicks). С этой частью все.

Теперь займемся методам SetZero. Он должен просто обнулять число щелчков. Для этого измените порожденный мастером код следующим образом:

Public Function SetZero() As Variant
  m_Clicks = 0
End Function

Все, теперь можно наш проект компилировать и использовать в любом проекте. После компиляции создайте новый проект типа Standard EXE. В нем зайдите в меню Project и далее выберите пункт Components. В появившемся диалоговом окне Components нажмите на кнопку Browse.

Появится окно Add ActiveX Control. С его помощью найдите на диске наш откомпилированный ActiveX (у него расширение *.ocx), после чего нажмите на кнопку Open и затем на OK. Наш ActiveX появится на панели элементов.

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

Option Explicit
Dim k As Integer
Private Sub UserControl11_Click()
  k = k + 1
  Form1.Caption = k
End Sub

Private Sub UserControl11_NoClicks()
  Form1.Caption = "No Clicks"
  Beep
End Sub

Добавьте еще на форму кнопку и напишите для нее код:

Private Sub Command1_Click()
  UserControl11.SetZero
  k = 0
End Sub

Запустите программу. При первых трех щелчках в заголовке формы будет появляться номер щелчка, при последующих - надпись No Clicks.

При нажатии на кнопку все приводится в начальное состояние, и событие Click опять возникает при первых трёх щелчках.

Измените код для Command1_Click на

Private Sub Command1_Click()
  UserControl11.Clicks = 1
  k = 0
End Sub

Теперь при запуске и последующем нажатии на кнопку возникнет ошибка 382 (так как свойство Clicks на этапе выполнения мы задали как свойство только для чтения).

Все работает, как и ожидалось.

Наверх

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

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



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

В избранное