Урок 3
ActiveX Control, созданный из стандартного
Свойство по умолчанию
Присоединение ActiveX Control'а к базе данных
Третий урок будет посвящен созданию ActiveX Control'а из уже существуещего, и добавим в него свои свойства. В своих приложениях я часто сталкивался с тем, что в текстовые поля необходимо ввести ограничения для ввода пользователем (допустим только числа или только латинские буквы). Появились стандартные функции, которые кочевали у меня из программы в программу. Собственно говоря, благодаря этому (лень - двигатель прогресса) и родился этот контрол, который включает в себя стандартный набор всего, что содержит TextBox плюс "маленький довесок" от меня.
Добавлять свойства и методы к стандартному контролу - занятие неблагодарное. Мы должны повторить описание того, что уже есть и потом уже добавить свое. Вот здесь-то и становится незаменимым Мастер по созданию ActiveX Control'ов, выполняя всю рутинную работу за Вас. Приступая к описанию создания этого контрола, хочу сразу оговориться, что в данной статье использованы только несколько из основных свойств, методов и событий (ведь пример-то учебный), делающих наш ActiveX Control вполне функциональным. При желании, разобравшись, что к чему, я думаю, Вы сами легко сделаете необходимые дополнения.
NB! Свойства стандартных ActiveX Control'ов, являющимися "только для чтения", и использованные в Ваших контролах, будут доступны только программным путем и не будут отображаться в окне свойств.
Итак, открываем новый проект и помещаем на него TextBox. Называем проект NewTextBox (запишем в Dtscription "TextBox с дополнительными свойствами"), а UserControl переименуем в NewText, заодно изменим в Text1 свойство Text так же на NewText.
Не откладывая в долгий ящик, сделаем зависимыми размеры TextBox'a от размеров UserControl'a:
Private Sub UserControl_Resize()
Text1.Move 0, 0, Width, Height
End Sub
Запускаем мастера и выбираем для нашего контрола следующее:
Свойства: BackColor, BorderStyle, Font, ForeColor, MaxLength, Text
События: Change, Click, KeyUp, KeyPress, KeyDown, MouseUp, MouseMove, MouseDown
В следующем шаге мастера нам предлагают включить свои "изобретения". Ну что ж, добавим два своих свойства: Format и SelectedText. Идем дальше. Всем стандартным свойствам и событиям присваиваем свойства и события от Text1. А на следующем шаге займемся своими свойствами. Свойству Format в DataType выберем пока тип Long (в дальнейшем мы это исправим) и DefaultValue оставим равным 0; а свойству SelectedText определим тип Boolean и DefaultValue = False. Нажимаем кнопку Finish и смотрим, что у нас получилось. Основная часть кода (та, что связана со стандартными свойствами и событиями) "готова к употреблению". Дело за малым подправить собственные свойства. Для начала опишем константы для свойства Format - это свойство "узаконивает" введение определенных знаков в текстовое поле:
Public Enum constFormat
Нет = 0
Заглавные = 1
Прописные = 2
Числа = 3
End Enum
И исправим объявление Property для него: Public Property Get Format() As constFormat и Public Property Let Format(ByVal New_Format As constFormat) соответственно. А так же объявление внутренней переменной для него.
Dim m_Format As constFormat
Теперь чтобы это свойство заработало, внесем дополнения в событие KeyPress для Text1.
Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case m_Format
Case Заглавные
' считываем код нажатой клавиши, преобразуем его в символ, делаем заглавным и снова возвращаем символ
KeyAscii = Asc(UCase(Chr(KeyAscii)))
Case Прописные
' считываем код нажатой клавиши, преобразуем его в символ, делаем прописным и снова возвращаем символ
KeyAscii = Asc(LCase(Chr(KeyAscii)))
Case Числа
Select Case KeyAscii
'определяем коды доступные для ввода: Space, BackSpace и числа от 0 до 9
Case 0, 8, 48 To 57
Case Else
'в противном случае символ не выводится, а выдается сигнал
KeyAscii = 0
Beep
End Select
End Select
RaiseEvent KeyPress(KeyAscii)
End Sub
Со свойством SelectedText (он при параметре True выделяет весь текст при попадании фокуса на контрол) все гораздо проще. Добавим событие GotFocus для Text1.
Private Sub Text1_GotFocus()
'проверка на длину текста и установки свойства
If Len(Text1) > 0 And m_SelectedText = True Then
'старт выделения 0 позиция
Text1.SelStart = 0
'длина выделения - длина текста
Text1.SelLength = Len(Text1)
End If
End Sub
Вот и все по написанию кода. В ToolboxBitmap определим картинку, какую бы мы хотели увидеть на панели инструментов для нашего контрола. Откроем меню Tools/Procedure Attributes… Сделаем описания для всех свойств, методов и событий нашего ActiveX Control'a.
Задержимся поподробнее на свойстве Text. Во-первых, нам хотелось бы сделать его свойством по умолчанию (например, мы смогли бы обратиться к нему NewText1, а не выписывать целиком NewText1.Text). Нажмем кнопку Advanced и в поле Procedure ID выберем опцию (Default). Во-вторых, желательно бы было подключать наш контрол к базе данных. Для этого, при выбранном свойстве Text, включите CheckBox "Property is data bound" и подключите, ставшие доступными следующие за ним четыре опции.
Осталось протестировать вновь созданный контрол. Как это делается Вы, наверное, помните (если нет, посмотрите предыдущие два урока).
Ну и напоследок полный листинг нашего АctiveX Control'a.
1999 г