Visual Basic 6. Руководство разработчика

       

Доработанный элемент управления


TextBox

Элемент управления CTextBox представляет собой специальный элемент управ­ления ActiveX, который расширяет возможности стандартного элемента управления TextBox. Это простой элемент (он наследует все функциональные возможности элемента управления TextBox), однако он оказывается очень полезным при конструировании приложений для ввода данных. Как будет показано далее, доработки совершенно просты и, на самом деле, тривиальны в реализации.

Большинство разработчиков занималось созданием экранов ввода данных, в которых некоторые поля являются обязательными, и, возможно, разрабатывали формы с элементами управления TextBox, окрашенными в тот или иной цвет в зависимости от того, является ли соответствующее поле обязательным, или нет. Или, возможно, использовали событие LostFocus обязательного поля, чтобы задержать фокус в этом поле до тех пор, пока пользователь не введет значение

А как насчет доработанного элемента управления TextBox, который изменяет цвет после того, как значение введено? На рис. 16.18 показана форма ввода данных, использующая такой доработанный элемент управления TextBox. Поля Name (Имя), Last Name (Фамилия) и E-mail (электронный адрес) являются обязательными, а соответствующие элементы управления TextBox первона чально окрашены в красный цвет. Если пользователь перемещает фокус и не вводит значения в эти поля, то они остаются красными. Если же значение в поле введено, то его цвет изменяется на белый. Другая возможность доработанного элемента управления TextBox состоит в том, что он изменяет цвет, когда получает фокус, и, таким образом, пользователь может быстро найти активный элемент управления на форме. Как можно, вероятно, догадаться, используется идея, примененная в формах ввода данных на Web страницах, где для указания обяза тельных полей используется звездочка.

Рис. 16 18 Элемент управления CTextBox расширяет стандартный элемент управления TextBox, добавляя к нему несколько специальных свойств

VB6 в действии: проект CTextBox

Откройте проект CTextBox на компакт диске и запустите его. При первом открытии проекта появляется сообщение об ошибке, указывающее, что элемент управления CTextBox не может быть загружен. Продолжите загрузку проекта, а затем откройте его тестовую форму. Все экземпляры элемента управления CTextBox заменены элементами PictureBox. Удалите элементы управления PictureBox с формы и создайте массив из семи элементов управления CTextBox. Поместите их на форму, как показано на рис. 16.18, выравнивая с соответствующими заголовками и друг с другом. Затем запустите проект, нажав клавишу F5, и проверьте функциональные возможности нового элемента управления.


Спецификация элемента управления CTextBox

Конструирование элемента управления CTextBox довольно просто. Ведь он идентичен стандартному элементу управления TextBox и обеспечивает несколько дополнительных свойств, рассмотренных ниже.

EnterFocusColor.

Когда элемент управления получает фокус, цвет фона устанавли­вается равным этому значению. Если не нужно, чтобы активный в текущий момент элемент управления изменял цвет, установите EnterFocusColor равным белому цвету.



LeaveFocusColor.

Когда элемент управления теряет фокус, цвет фона устанав­ливается равным этому значению (это свойство обычно равно белому цвету для необязательных полей и имеет то же значение, что и MandatoryColor для обяза­тельных полей).

Mandatory. Это свойство указывает, является ли элемент управления обязательным полем, если Mandatory = 1, или необязательным полем, если Mandatory = 0.

MandatoryColor. Это свойство задает цвет фона элемента управления, если его свойство Mandatory = 1 (обязательное поле). MandatoryColor заменяет значение установки LeaveFocusColor. Точнее, если пользователь пропускает обязательное поле, то соответствующий элемент управления окрашивается в MandatoryColor, a не в LeaveFocusColor. Следует обратить внимание на то, что обязательные поля (Mandatory = 1) ведут себя так же, как и необязательные поля после того, как в них было введено значение.

Для изучения использования этих свойства при конструировании формы ввода данных нужно открыть проект CTextBox и поэкспериментировать со значениями специальных свойств, чтобы понять их воздействие на работу элемента. В связи с тем, что элемент управления CTextBox не является стандартным элементом интерфейса Windows, пользователи могут не сразу понять, что означает изменение цвета. Но ни у кого не займет много времени, чтобы приобрести навыки и начать эффективно использовать эту возможность.

Конструирование элемента управления CTextBox

Конструирование элемента управления CTextBox достаточно просто. Чтобы разработать заказной элемент управления, имеющий все компоненты стандартного элемента управления TextBox (кроме свойств, относящихся к установлению связи с данными), используется мастер интерфейса элемента управления ActiveX. Мастер автоматически создаст исходный текст, после чего нужно добавить несколько операторов, которые изменяют цвет фона элемента управления в зависимости от значений свойств и его содержимого.



Создайте новый проект элемента управления ActiveX и, как обычно, добавьте тестовый проект. Назовите компоненты проекта следующим образом.

1. Выберите проект и измените название на ColorTextBox.

2. Выберите объект UserControl и замените имя на CTextBox.

3. Выберите тестовый проект и измените имя на TestProject.

4. Выберите тестовую форму и замените имя на TestForm.

Так как специальный элемент управления есть не что иное, как элемент управления TextBox, следует поместить экземпляр элемента управления TextBox на него. Элемент управления TextBox должен накрыть весь объект UserControl, поэтому нужно ввести следующий ниже код в обработчик события Resize объекта UserControl.

Private Sub UserControl_Resize()

Textl.Move 0, 0, UserControl.Width, UserControl.Height

End Sub

Остальная часть кода пользователя должна использовать свойство Mandatory, поэтому этот код сейчас добавить нельзя. На этом этапе можно запустить мастер интерфейса элемента управления ActiveX, чтобы сгенерировать большую часть кода. Наша цель состоит в том, чтобь! включить все функциональные возможности элемента управления TextBox в наш специальный элемент управления.

В окне Select Interface Members следует переместить следующие компоненты и списка Available Names (Доступные Имена) в список Selected Names (Выбранньи Имена).

Appearance

KeyDown

MouseUp

OLEGiveFeedback

Backcolor

KeyPress

MultiLine

OLESetData

Click

KeyUp

OLECompleteDrag

OLEStartDrag

Change

Max Length

OLEDrag

PasswordChar

DblClick

MouseDown

OLEDragDrop

Refresh

Enabled

Mouselcon

OLEDragMode

Text

Font

MouseMove

OLEDragOver

ToolTip

ForeColor

MousePointer

OLEDropMode

Это базовые части элемента управления TextBox, за исключением свойств, предназначенных для установки связи с данными (DataSource, DataMember и т.д.). При дублировании функциональных возможностей существующего элемента управ­ления в специальном элементе управления нужно удостовериться, что все компонен­ты, которые разработчик ожидает найти в специальном элементе управления, там появились. Свойства для установления связи с данными пропущены потому, что сейчас не планируется использование элементов управления при работе с базами данных (Тема создания элементов управления, связанных с данными, довольно сложна и не раскрывается в этой книге)



После нажатия на кнопку Next отобразится следующее окно Create Custom Interface Members (Создание специальных частей интерфейса). Здесь нужно добавить следующие специальные компоненты.

EnterFocusColor.

Цвет фона элемента управления, когда он получает фокус.

LeaveFocusColor.

Цвет фона элемента управления, когда он теряет фокус.

Mandatory. Если это свойство имеет значение True, цвет фона элемента управления равен значению свойства MandatoryColor, чтобы показать, что элемент управления используется для требуемого поля.

MandatoryColor.

Цвет фона элемента управления, у которого свойство Mandatory равно True.

В следующем окне мастера отображаются все компоненты, за исключением специальных, соответствующих свойствам элемента управления

TextBoxl. Ни один из компонентов элемента управления CTextBox не отображается на объект UserControl просто потому, что TextBox полностью включает в себя весь объект UserControl.

В следующем окне Set Attributes задайте значения специальных свойств. Введите атрибуты, показанные в табл. 16.4, в соответствующие поля окна Set Attributes мастера.

Таблица 16.4. Значения специальных свойств

Свойство

Тип данных

Значение по умолчанию

В режиме выполнения

В режиме конструирования

EnterFocusColor LeaveFocusColor Mandatory MandatoryColor

OLECOLOR OLECOLOR Boolean OLECOLOR

&HOOFFFF &HFFFFFF False &HFFOOOO

Чтение/Запись Чтение/Запись Чтение/Запись Чтение/Запись

Чтение/Запись Чтение/Запись Чтение/Запись Чтение/Запись

В том же окне можно также ввести описание каждого свойства, которое появ­ляется в окне Properties, когда выбрано соответствующее свойство. После щелчка мышью на кнопке Next, а затем на кнопке Finish будет сгенерирован код элемента управления.

Теперь можно открыть окно Code объекта UserControl и просмотреть код, сгенерированный мастером. Следующие переменные и начальные значения распо­ложены в верхней части окна Code:

' Значения свойств, устанавливаемые по умолчанию:

Const m_def_Mandatory =



False

Const m_def_EnterFocusColor = &HFFOOFF

Const m_def_MandatoryColor = &HFF

Const m_def_LeaveFocusColor = &HFFFFFF

' Переменные свойств:

Dim m_Mandatory As Boolean

Dim m_EnterFocusColor As Variant

Dim m_MandatoryColor As OLE_COLOR

Dim m_LeaveFocusColor As OLE_COLOR

Эти объявления переменных и констант соответствуют свойствам, которые были заданы в окнах мастера. Все стандартные элементы уже реализованы, и их не нужно изменять, кроме процедур свойства Appearance. Мастер реализует это свойство как Integer, но использование перечислимого типа более предпочтительно для свойств, имеющих ограниченное число значений. Поэтому добавьте следующее объявление типа:

Enum Flat3D

Flat

[3D]

End Enum

и затем измените процедуры свойства следующим образом.

Программа 16.17. Модифицированные процедуры свойства Appearance

Public Property Get Appearance() As Flat3D

Appearance = Text1.Appearance

End Property

Public Property Let Appearance(ByVal New Appearance As Flat3D)

Text1.Appearance() = New Appearance

PropertyChanged "Appearance"

End Property

Нужно также изменить код процедуры Property Let для свойства MandatoryColor. Это свойство может быть установлено только в случае, если свойство Mandatory элемента управления равно True. Если оно равно False, то пользователь должен сначала изменить его, а затем задать свойство MandatoryColor.

Программа 16.18. Модифицированные процедуры свойства MandatoryColor

Public Property Let MandatoryColor(ByVal New_MandatoryColor As _

OLE_COLOR)

m_MandatoryColor = New_MandatoryColor

If m_Mandatory Then Text1.Backcolor = New_MandatoryColor

PropertyChanged "MandatoryColor"

End Property

Свойство Mandatory имеет тип Integer. Можно ввести любые целочисленные значения в его поле в окне Property. Определим следующий перечислимый тип:

Enum ReqOpt

[Optional]

Required

End Enum

Следует обратить внимание, что значение Optional должно быть заключено в квадратные скобки, так как оно является ключевым словом Visual Basic. Измените процедуры свойства Mandatory следующим образом.



Программа 16.19. Модифицированные процедуры свойства Mandatory

Public Property Get Mandatory() As ReqOpt

Mandatory = m_Mandatory

End Property

Public Property Let Mandatory(ByVal New_Mandatory As ReqOpt)

m_Mandatory = New Mandatory

If m Mandatory = Required Then

Text1.Backcolor = m_MandatoryColor

Else

Text1.Backcolor = m_def_LeaveFocusColor

End If

PropertyChanged "Mandatory"

End Property

Когда свойство Mandatory установлено в True, элемент управления автоматически устанавливает свойство цвета фона равным значению свойства MandatoryValue.

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

TextBox. Код, расширяющий возможности элемента управления TextBox, расположен в событии LostFocus объекта UserControl. Когда пользователь убирает фокус с элемента управления CTextBox, код проверяет содержимое элемента управления и свойство Mandatory. Если элемент управления пуст и свойство Mandatory равно True, то цвет фона элемента управления TextBox устанавливается равным значению свойства MandatoryColor.

Программа 16.20. Обработчик события LostFocus объекта UserControl

Private Sub Textl_LostFocus ()

If Len(Trim(Textl.Text)) = 0 And m_Mandatory = Required Then

Text1.BackColor = m_MandatoryColor

Else

           Text1.BackColor = LeaveFocusColor

End  If

End Sub

Примечание

Обратите внимание, что код не инициирует событие

LostFocus. Хотя поведение элемента управления, когда он теряет фокус, определяется кодом, все же можно еще написать обработчик события LostFocus. Можно

использовать событие LostFocus, потому что это событие не может быть вызвано непосредственно самим элементом управления. Оно вызывается контейнером элемента управления (т.е. формой), и нельзя инициировать это событие из кода элемента управления. Таким образом, если даже в коде элемента управления отсутствует оператор RaiseEvent LostFocus (), обработчик события LostFocus все же можно запрограммировать. То же верно и для события GotFocus, которое также вызывается контейнером, а не элементом управления.



Элемент управления CTextBox имеет иную возможность: когда его активизи­руют, он изменяет цвет фона на значение свойства EnterFocusColor.

Private Sub Textl_GotFocus()

Text1.Backcolor = EnterFocusColor

End Sub

Если такое поведение вас не устраивает, то просто нужно присвоить свойству EnterFocusColor значение цвета фона элемента управления.

При конструировании элементов управления ActiveX используются как прие­мы разработки стандартных VB-приложений, так и приемы разработки компонентов ActiveX. Их свойства, методы и события обрабатываются точно так же, как и их дубликаты в компонентах ActiveX, а именно:

• свойства — это закрытые переменные, которые можно считывать или устанав­ливать через процедуры property;

• методы — это общедоступные подпрограммы;

•  события могут быть инициированы из любого места в коде элемента управления ActiveX с помощью метода RaiseEvent.

Видимый интерфейс элемента управления отображается на объекте UserControl, который подобен форме. Он поддерживает почти все свойства и методы формы, включая методы рисования. Отсутствуют какие-либо средства для загрузки и выгрузки UserControls, какие есть для форм, однако можно сделать элемент управ­ления видимым или невидимым на этапе выполнения с помощью команд про­граммного кода.

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

Ответственность за интеграцию элемента управления ActiveX в среду разработки лежит на Visual Basic. Свойства, добавляемые к элементу управления, автоматически отображаются в окне Properties, а синтаксис методов отображается по мере ввода кода (они включены в средство AutoList Members из Visual Basic). Процесс конструирования элемента управления ActiveX поразительно похож на процесс разработки стандарт­ного приложения VB. Но в результате появляется "новое существо, которое может жить" в различных средах, включая Web-страницы, что будет показано в последней части этой книги.



Часть V. Программирование баз данных на Visual Basic

Глава 17. Программирование баз данных на Visual Basic

Глава 18. Элементы управления Active Data Object

Глава 17. Программирование баз данных на Visual Basic

• Базы данных и системы управления базами данных

• Концепция реляционных связей

• Использование Visual Data Manager

• Структура базы данных BIBLIO

• Проверка корректности данных

• Ввод данных

• Доступ к полям в наборах записей (RecordSet)

• Введение в SQL

• Использование усовершенствованных элементов управления, связанных с данными

• Отображение баз данных

Тема, которая слишком велика, чтобы поместиться в одной главе — это программирование баз данных. Эта глава озаглавлена именно так, но на самом деле является лишь введением в основные понятия программирования баз данных на Visual Basic. Она предназначена для тех, кто намерен создавать небольшие базы данных и уже знаком с другими системами управления базами данных, например, с системой dBase. Тем, кто знаком с программированием баз данных в других средах, информация, приведенная в этой главе, поможет освоиться в программи­ровании баз данных на Visual Basic.

Примечание

В приложениях этой главы используются примеры баз данных BIBLIO и NWIND, которые входят в версию Professional Edition of Visual Basic. Имена баз данных жестко заданы во многих примерах. В частности, поиск баз данных осуществляется в заданной по умолчанию папке, создаваемой во время установки. Если Visual Basic установлен в другой папке, то необходимо изменить путь к базе данных, чтобы он соответствовал расположению базы в системе. Для этого необходимо изменить свойство DatabaseName в элементе управления Data (если приложение использует Data) или путь к базе данных в методе OpenDatabaseQ в исходном тексте программы (если приложение открывает базу данных непосредственно). Так как нельзя изменить эти установки в программах на CD, сначала скопируйте примеры приложений в папку на жестком диске, после чего их можно будет запускать и/или изменять.


Содержание раздела