назад | содержание | вперед

Добавление и удаление столбцов

В первую очередь необходимо добавить в элемент DataGrid необходимое количество столбов. Для добавления нового столбца выполните следующие шаги:

1. Выберите элемент DataGrid.

2. Нажмите правую кнопку мыши и выберите из контекстного меню команду Edit (Правка). Объект переходит в режим редактирования.

3. Для добавления нового столбца можно использовать команду Insert, которая добавит новый столбец перед тем столбцом, на который был установлен курсор мыши перед вызовом контекстного меню. Если вам необходимо добавить новый столбец в конец таблицы, то выполните команду Append контекстного меню.

Удаление столбца из объекта DataGrid выполняется аналогично добавлению. Сначала необходимо перевести объект в режим редактирования, затем установить курсор на удаляемый столбец и выбрать из контекстного меню команду Delete.

На рис. 17.26 показана форма с элементом управления DataGrid, в который добавлены столбцы.

Рис. 17.26. Элемент DataGrid с добавленными столбцами

Использование разделов

Элемент управления DataGrid позволяет разбить таблицу, содержащую данные, на несколько разделов, настраиваемых отдельно.

Для добавления нового раздела перейдите в режим редактирования элемента DataGrid, выбрав команду Edit контекстного меню, а затем выберите из этого же меню команду Split. Если вам потребуется удалить раздел, то воспользуйтесь командой Remove.

На рис. 17.27 показана форма с элементом управления DataGrid, который разделен на два раздела.

Рис. 17.27. Элемент DataGrid, разделенный на два раздела

Настройка параметров элемента DataGrid с помощью диалогового окна Property Pages

Для настройки всех параметров элемента DataGrid удобнее всего использовать диалоговое окно Property Pages (рис. 17.28), которое вызывается командой Properties контекстного меню.

Вкладка General (Основные) предназначена для настройки основных свойств элемента DataGrid. Поле ввода Caption содержит заголовок элемента, который будет отображаться в его верхней части. В левой части вкладки расположена область, содержащая флажки следующего назначения:

Рис. 17.28. Диалоговое окно Property Pages для элемента DataGrid

Флажок

Описание

AllowAddNew

Позволяет при работе с элементом DataGrid добавлять новые записи

AllowDelete

Позволяет при работе с элементом DataGrid удалять новые записи

Allowllpdate

Установленный флажок позволяет редактировать записи

ColumnHeaders

При установленном флажке заголовки столбцов будут отображаться на экране. В противном случае они будут отсутствовать

Enabled

Если данный флажок не установлен, то элемент DataGrid недоступен пользователю


 

В правой части вкладки General диалогового окна Property Pages расположены поля и списки, которые устанавливают значения одноименных свойств элемента управления:

Поле/список

Назначение

DefColWidth

Ширина создаваемых столбцов по умолчанию

HeadLines

Количество строк, выделяемых для заголовка столбца

RowHeight

Высота строки элемента управления DataGrid

Appearance

Устанавливает внешний вид элемента и имеет следующие значения: dbgFlat — двумерное оформление элемента, dbg3D — трехмерное оформление элемента

BorderStyle

Определяет тип обрамления элемента управления: dbgNoBorder — нет обрамления, dbgFixedSingle — обрамление в виде одиночной линии

RowDividerStyle

Задает тип линий между строками с данными



Вкладка Keyboard

Вкладка Keyboard (Клавиатура) (рис. 17.29) устанавливает свойства, которые непосредственно связаны с клавишами клавиатуры.

Рис. 17.29. Вкладка Keyboard диалогового окна Property Pages элемента DataGrid

В левой части вкладки расположены флажки, которые управляют перемещением курсора. Их названия совпадают с одноименными свойствами элемента управления:

Флажок

Назначение

AllowArrows

Данный флажок в установленном состоянии позволяет использовать клавиши-стрелки для передвижения по строкам и столбцам

TabAccrossSplits

Если установить этот флажок, то при работе с элементом DataGrid перемещение между разделами будет осуществляться с помощью клавиши <ТаЬ>

WrapCellPointer

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



Раскрывающийся список TabAction определяет свойство с таким же найме нованием, которое обуславливает поведение курсора при использовании клавиши <ТаЬ>. Это свойство может принимать следующие значения:

Значение

Описание

dbgControlNavigation

При нажатии на клавишу <ТаЬ> курсор будет переходить от одного элемента к другому

dbgColumnNavigation

Если выбрать это значение, то с помощью клавиши <ТаЬ> курсор будет переходить между столбцами элемента DataGrid. При нажатии клавиши <ТаЬ> в последнем столбце курсор перейдет в следующий элемент, расположенный в форме

dbgGridNavigation

С помощью клавиши <ТаЬ> курсор будет перемещаться по столбцам, но при достижении последнего столбца курсор не покинет элемент DataGrid, а будет себя вести, как описано в свойстве WrapCellPointer


 

Вкладка Columns

Вкладка Columns (Столбцы) (рис. 17.30) используется для настройки следующих параметров столбцов:

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

2. В поле ввода Caption ввести заголовок столбца.

3. Теперь необходимо связать столбец с полем результирующего множества. Для этого используется раскрывающийся список DataField. В этом списке находятся все доступные для работы поля объекта corranand, который был выбран нами ранее в качестве источника данных. Выберите из этого списка поле, с которым связывается текущий столбец.

Рис. 17.30. Вкладка Columns диалогового окна Property Pages элемента DataGrid

После настройки одного столбца можно повторить все шаги для последующих столбцов. Завершив настройку всех столбцов, нажмите кнопку Применить, и все изменения будут сохранены.

Вкладка Layout

Вкладка Layout (Расположение) (рис. 17.31) используется для настройки внешнего вида столбцов каждого из разделов.

Раскрывающийся список Split содержит все доступные для данного элемента DaraGrid разделы, а список Column — столбцы, входящие в текущий раздел. Для разных разделов, а также столбцов можно определить свой внешний вид с помощью флажков и полей, расположенных на вкладке.

Рис. 17.31. Вкладка Layout диалогового окна Property Pages

В левой части вкладки расположены флажки, предназначенные для установки значений одноименных свойств:

Флажок

Назначение

Locked

При установке флажка содержание столбца предназначено только для чтения информации

AllowSizing

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

Visible

При установленном флажке столбец будет виден на экране. В противном случае столбец виден не будет

WrapText

При установке флажка введенный в ячейку текст отображается на нескольких строках

Button

При установке флажка в правой части ячейки появляется кнопка раскрытия списка


 

Раскрывающийся список DividerStyle устанавливает свойство DividerStyle для отдельного столбца. Данное свойство предназначено для определения правой границы столбца.

С помощью раскрывающегося списка Alignment можно задать выравнивание информации в столбце. Список содержит следующие значения:

Значение

Описание

DbgLeft

Содержимое столбца выравнивается по левому краю

DbgRight

Содержимое столбца выравнивается по правому краю

DbgCenter

Текст, содержащийся в столбце, размещается в центре

DbgGeneral

Если столбец содержит текст, то он будет выровнен по левому краю, если число, то оно будет выровнено по правому краю


 

Поле ввода Width предназначено для определения ширины столбца.

Вкладка Color

На вкладке Color (Цвет) (рис. 17.32) вы можете установить цвета, которые определяют внешний вид вашего элемента DataGrid.

В списке Properties находятся объекты, которые могут быть изменены. Значение BackColor определяет цвет фона для столбцов элемента DataGrid, a ForeColor — цвет текста в столбцах.

Раскрывающийся список Color Set содержит список доступных цветовых схем. Значение Standard Colors определяет стандартную цветовую схему, a Windows System Colors — цветовую схему системы Windows.

Кнопка Edit Custom Color предназначена для настройки нового цвета.

Рис. 17.32. Вкладка Color диалогового окна Property Pages

Вкладка Font

Вкладка Font (Шрифт) (рис. 17.33) используется для настройки шрифтов

элемента DataGrid.

Значение Font списка Properties устанавливает шрифт для отображения информации в столбцах, a HeadFont — шрифт для заголовков столбцов.

Раскрывающиеся списки Font и Size позволяют определить соответственно наименование шрифта и его размер. Флажки Bold, Italic, Underline и Strikeout устанавливают начертание шрифта: полужирный, курсив, подчеркнутый и зачеркнутый.

Рис. 17.33. Вкладка Font диалогового окна Property Pages

Внешний вид текста, который получается в результате всех изменении, можно просмотреть в поле ввода Sample Text.

Вкладка Splits

Вкладка Splits (Разделы) (рис. 17.34) предназначена для определения свойств разделов. Для того чтобы установить свойства для раздела, выберите настраиваемый раздел в раскрывающемся списке Split.

Рис. 17.34. Вкладка Splits диалогового окна Property Pages

В левой части вкладки расположены флажки следующего назначения:

Флажок

Назначение

Locked

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

AllowFocus

Разрешает установку фокуса на раздел

AllowSizing

При установке флажка размер раздела можно изменять в режиме выполнения формы

AllowRowSizing

При установке флажка можно изменять высоту строк в режиме выполнения формы

RecordSelectors

При установке флажка в разделе будет отображаться индикатор строки


 

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

Раскрывающийся список ScrollBars определяет способ отображения полос прокрутки:

Раскрывающийся список MarqueeStyle позволяет задать способ выделения выбранной ячейки.

Параметры области, расположенной в нижней части вкладки, служат для определения размеров разделов. С помощью списка SizeMode задается способ установления размеров разделов, в нем содержатся следующие значения:

Значение

Описание

dbgScalable

Размеры разделов пропорциональны между собой. Пропорция задается с помощью свойства size каждого раздела

dbgExact

Для того чтобы задать размер раздела точным числом, выберите это значение списка и введите в поле Size нужный размер


 

Вкладка Format

Вкладка Format (Формат) (рис. 17.35) предназначена для определения формата отображения данных в столбцах. В раскрывающемся списке Format

Рис. 17.35. Вкладка Format диалогового окна Property Pages

Item выбирается настраиваемый столбец и с помощью списка Format Type устанавливается тип данных.

Создание компонентов ActiveX для управления данными

В начале главы мы рассмотрели создание приложений с использованием компонентов ADO (ActiveX Data Object). Однако иногда вас могут не устраивать предлагаемые стандартные средства. Это может быть в том случае, если создаваемое приложение имеет специфические особенности, а также, если вы хотите унифицировать элементы интерфейса и использовать их в нескольких формах, а может быть и в нескольких приложениях. Решением в подобной ситуации становится создание собственных ActiveX-компонентов. В данном разделе рассмотрим несколько примеров создания таких компонентов.

Создание компонента ownNavigator

Создадим ActiveX-компонент, который может являться источником данных для других компонентов и использоваться для перемещения по записям в базе данных и осуществления простейших операций по модификации ее содержимого. Для создания ActiveX-компонента откройте новый проект типа ActiveX Control. Он будет содержать единственный ActiveX-компонент — userControll. Присвойте проекту имя ownDataControls, а компоненту — ownNavigator.

Размещение элементов управления

ActiveX-компонент будем создавать на основе стандартных элементов управления. Добавьте в него шесть кнопок управления (рис. 17.36) и задайте для них приведенные ниже значения свойств Name и caption.

Рис. 17.36. Размещение кнопок управления

Значение свойства Name

Значение свойства Caption

cmdFirst

&Начало

cmdPrev

На&зад

cmdNext

В&перед

cmdLast

&Конец

cmdinsert

&Добавить

cmdDelete

&Удалить



Осуществление доступа к данным

Теперь надо определить средства доступа к данным. Для этих целей будем использовать технологию ADO (ActiveX Data Objects). Чтобы получить набор строк источника данных, воспользуемся объектами Recordset и Connection.

Добавьте в исходный код модуля ownNavigator описание используемого объекта Recordset:

Dim WithEvents mrstMain As ADODB.Recordset

Добавьте также в исходный код объекта connection, используемого для соединения с сервером, следующий код:

Dim WithEvents mcnnMain As ADODB.Connection

Ключевое слово WithEvents, включенное в описание этих объектов, позволит обрабатывать связанные с ними события.

Теперь рассмотрим создание описанных объектов, осуществление соединения и выборки записей. Чтобы можно было программно управлять этим процессом на этапе дальнейшего использования компонента ownNavigator, добавим два общедоступных метода OpenRecordset и CloseRecordset:

Public Sub OpenRecordset ()

If mcnnMain Is Nothing Then

'создаем Connection

Set mcnnMain = New ADODB.Connect ion

'устанавливаем его параметры

mcnnMain.CursorLocation = adUseClient

mcnnMain.Provider = "SQLOLEDB.1"

mcnnMain.CommandTimeout = 300

'строка для соединения, имя пользователя, пароль

mcnnMain.Open "Data Source= MYSERVER; Initial Catalog=SALES", "SYSADM", "SYSADM"

End If

If mrstMain Is Nothing Then

'создаем Recordset

Set mrstMain = New ADODB.Recordset

'открываем Recordset

mrstMain.Open "customer", mcnnMain, adOpenKeyset, adLockOptimistic, adCmdTable

If Not (mrstMain.BOF And mrstMain.EOF) Then mrstMain.MoveFirst

End If

End Sub

Public Sub CloseRecordset ()

'если Recordset открыт — закрываем

If mrstMain.State о adStateClosed Then mrstMain.Close

'уничтожаем Recordset

Set mrstMain = Nothing

'если Connection открыта — закрываем

If mcnnMain.State <> adStateClosed Then mcnnMain.Close

'уничтожаем Connection

Set mcnnMain = Nothing

End Sub

Замечание

В данном примере для простоты мы задали фиксированные параметры источника данных. Способы устранения подобных ограничений и придания гибкости ActiveX-компоненту будут рассмотрены ниже.

Объект Recordset осуществляет выборку из таблицы Customer и позволяет не только просматривать, но и редактировать записи (параметр adOpenKeyset). При открытии Recordset текущая позиция устанавливается перед первой записью. Естественно, что мы не получим при этом никаких данных. Для того чтобы выполнить перемещение на первую доступную запись, можно воспользоваться методом MoveFirst. Однако, если набор записей пуст, подобные действия приведут к ошибке. Проанализировать данную ситуацию можно с помощью свойств BOF и EOF объекта Recordset. Первое принимает значение True в том случае, если текущая позиция находится перед первой записью, второе истинно, если текущая позиция — за последней записью. Если они принимают значение True одновременно, значит Recordset не содержит ни одной записи. При закрытии источника данных осуществляется проверка, открыты ли они на данный момент, что позволяет гарантировать отсутствие ошибочной ситуации повторного закрытия.

Теперь рассмотрим действия, необходимые для перемещения по записям результирующего множества. Для этого напишем коды обработки событий при нажатии на соответствующие кнопки. По существу, каждая из кнопок будет просто вызывать соответствующие методы объекта Recordset.

Private Sub cmdFirst_Click()

mrstMain.MoveFirst

End Sub

Private Sub cmdPrev_Click()

mrstMain.MovePrevious

If mrstMain.BOF Then

inrstMain.MoveFirst

End If

End Sub

Private Sub cmdNext_Click()

mrstMain.MoveNext

If mrstMain.EOF Then

mrstMain.MoveLast

End If

End Sub

Private Sub cmdLast_Click()

mrstMain.MoveLast

End Sub

Заметим, что после перемещения на новую запись с помощью методов MovePrevious или MoveNext текущая позиция может оказаться за пределами выбранных записей. Для предотвращения этой ситуации осуществляется проверка с помощью свойств BOF и EOF.

Итак, создан ActiveX-компонент, который позволяет перемещаться по записям в таблице базы данных. Однако он не способен отображать их на экране. Для отображения данных в Visual Basic существует множество готовых элементов управления, например, TextBox. Для связывания элемента управления с результирующим множеством будем использовать стандартный механизма Data Binding, то есть для объекта TextBox зададим свойства DataSourse, DataMember И DataField. Чтобы создаваемый нами компонент мог выступать в роли объекта-источника, установим свойство DataSourceBehavior нашего объекта ownNavigator равным vbDataSource (рис. 17.37).

Рис. 17.37. Определение свойства DataSourceBehavior

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

Private Sub OserControl Initialize()

OpenRecordset

DataMembers.Add "Main"

End Sub

Private Sub UserControl_Terminate()

DataMembers.Clear

CloseRecordset

End Sub

В данном примере мы осуществляем доступ к одному объекту Recordset. Если их несколько в одном объекте-источнике, осуществлять выбор нужного позволит деление на несколько разделов DataMember. Для успешной работы этого механизма следует описать обработку события Get DataMember объекта userControl, которое происходит при попытке внешних объектов запросить содержимое раздела. Это событие передает параметр DataMember, где в виде строки задан требуемый раздел DataMember. Следует возвратить внешним объектам ссылку на соответствующий объект Recordset (или другой подобный источник) путем присвоения значения параметру Data данного события. В нашем случае это выглядит следующим образом:

Private Sub UserControl GetDataMember(DataMember As String, Data As Object)

If DataMember = "Main" Then

Set Data = mrstMain Else

MsgBox "DataMember " & DataMember & " не найден"

End If

End Sub

Тестирование ActiveX-компонента

До сих пор мы разрабатывали новый ActiveX-компонент, но не могли видеть результатов его работы. Перейдем теперь к его тестированию.

Создадим с помощью команды Add Project (Добавить проект) меню File (Файл) тестовый проект типа Standard EXE. Теперь он будет находиться в одной проектной группе с нашим проектом ownDatacontrois. Присвойте ему имя Testproject, а всей группе — TestGroup. Мы будем использовать их для отладки создаваемых нами компонентов ActiveX.

Чтобы новый элемент управления стал доступен в проекте Testproject, необходимо закрыть окно View Object, отображающее содержимое объекта ownNavigator. На панели инструментов появляется новый значок Я. Так обозначается созданный нами компонент. Добавьте компонент в форму проекта Testproject, увеличьте его размер, чтобы он был виден целиком.

Далее добавьте стандартные элементы управления Label и TextBox, как показано на рис. 17.38.

Рис. 17.38. Форма для тестирования компонента ownNavigator

В окне Properties элементов управления типа TextBox выберите свойство DataSource и раскройте список доступных объектов-источников. В нем появился добавленный в форму объект ownNavigatorl — экземпляр созданного нами элемента управления. Выберите его. Затем установите для свойства DataMember значение Main. На следующем шаге выберите для каждого элемента управления типа TextBox поле результирующей выборки.

Предупреждение

Если вы не позаботитесь о том, чтобы Recordset открывался сразу при инициализации объекта на этапе проектирования, то не будете иметь возможности выбирать поля среди доступных в Recordset.

Настройте соответствующим образом свойства caption объектов типа Label.

Назначьте проект Testproject основным проектом группы. Для этого выберите его в окне Project Group, нажмите правую кнопку мыши'и выберите из контекстного меню команду Set as Start Up (рис. 17.39) Имя проекта при этом выделится жирным шрифтом.

Теперь запустите созданный проект на выполнение. Для этого выполните команду Start меню Run или нажмите клавишу <F5>. Созданная нами форма просмотра данных из таблицы Customer приведена на рис. 17.40.

Рис. 17.39. Выбор основного проекта группы проектов

Рис. 17.40. форма просмотра списка покупателей

Замечание

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

Добавление и вставка записей

Вернемся к нашему проекту. Вы можете не только просматривать, но и изменять данные. Например, введите в поле Организация текст ОАО Теремок и переместитесь на другую запись. При этом произведенные вами изменения будут внесены в базу данных. Чтобы это проверить, вернитесь на предыдущую запись и убедитесь, что наименование организации изменено. Мы можем редактировать данные, однако нельзя добавить новую запись или удалить существующую. Исправим это. Мы уже предусмотрели в нашем элементе управления соответствующие кнопки Добавить и Удалить, теперь осталось описать те действия, которые будут выполняться при их нажатии.

Остановите работу приложения. Откройте окно редактора кода для компонента ownNavigator и добавьте следующие строки:

Private Sub cmdinsert Click()

mrstMain.AddNew

End Sub

Private Sub cmdDelete_Click ()

mrstMain.Delete

End Sub

По сути дела мы просто перекладываем свою работу на объект Recordset, вызывая его стандартные методы AddNew и Delete.

Запустите приложение и нажмите кнопку Добавить. Содержимое всех полей очистится, и в них можно ввести новые значения. Не забывайте о том, что некоторые поля в нашей таблице не допускают ввода пустых значений. Если этого не учитывать, то при добавлении новой строки может возникнуть ошибка. Итак, вы ввели все необходимые данные, теперь переместитесь на предыдущую запись так же, как это было в случае редактирования данных, описанном выше. В этом момент произойдет вставка новой строки. Вы можете найти новую строку, переместившись на последнюю запись с помощью кнопки Конец.

Для удаления записи нажмите кнопку Удалить. Запись будет удалена из таблицы, но не с экрана. Однако если вы покинете эту запись, то не сможете вернуться на нее вновь, поскольку ее уже не существует.

Совершенствование созданного компонента

Несмотря на то, что созданный компонент потенциально может осуществлять доступ и управлять отображением любой таблицы из базы данных, он имеет ограничения в применении, поскольку имя обрабатываемой таблицы, имя сервера, имя базы данных, имя пользователя и его пароль зафиксированы внутри его кода. Чтобы снять эти ограничения, добавим нашему компоненту ownNavigator пять свойств: Server, Database, User, Password, Table.

Public Property Let Server(ByVal newServer As String)

mstrServer = newServer

PropertyChanged "Server"

End Property

Public Property Get Server () As String

Server = mstrServer

End Property

Public Property Let Database(ByVal newDatabase As String)

mstrDatabase = newDatabase

PropertyChanged "Database"

End Property

Public Property Get Database () As String

Database = mstrDatabase

End Property

Public Property Let User(ByVal newUser As String)

mstrUser = newUser

PropertyChanged "User"

End Property

Public Property Get User() As String

User = mstrUser

End Property

Public Property Let Password(ByVal newPassword As String)

mstrPassword = newPassword

PropertyChanged "Password"

End Property

Public Property Get Password() As String

Password = mstrPassword

End Property

Public Property Let Table(ByVal newTable As String)

mstrTable = newTable

PropertyChanged "Table"

End Property

Public Property Get Table() As String

Table = mstrTable

End Property

Для хранения значений этих свойств объявим пять строковых переменных.

Dim rostrServer As String

Dim mstrDatabase As String

Dim mstrUser As String

Dim mstrPassword As String

Dim mstrTable As String

Чтобы значения этих свойств можно бьыо настраивать в интегрированной среде разработки Visual Basic, необходимо также описать события Readproperties и Writeproperties. Для первичной инициализации значений этих свойств воспользуемся событием initproperties.

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)

Server = PropBag.ReadProperty("Server", "")

Database = PropBag.ReadProperty("Database", "")

User = PropBag.ReadProperty("User", "")

Password = PropBag.ReadProperty("Password", "")

Table = PropBag.ReadProperty("Table", "")

End Sub

Private Sub UserControl Writeproperties(PropBag As PropertyBag)

PropBag.WriteProperty "Server", Server, ""

PropBag.WriteProperty "Database", Database, ""

PropBag.WriteProperty "User", User, ""

PropBag.WriteProperty "Password", Password, ""

PropBag.WriteProperty "Table", Table, ""

End Sub

Private Sub UserControl Initproperties ()

Server = ""

Database = ""

User = ""

Password = ""

Table = ""

End Sub

Теперь надо изменить метод openRecordset следующим образом:

Public Sub OpenRecordset()

On Error.Goto err_occur

If mcnnMain Is Nothing Then

'создаем Connection

Set mcnnMain = New ADODB.Connection

'устанавливаем его параметры

mcnnMain.CursorLocation = adUseClient

mcnnMain.Provider = "SQLOLEDB.1"

mcnnMain.CommandTimeout = 300

'строка для соединения, имя пользователя, пароль

mcnnNain.Open "Data Source= " & Server & "; Initial Catalogs" & Database, User, Password

End If

If mrstMain Is Nothing Then

'создаем Recordset

Set mrstMain = New ADODB.Recordset

'открываем Recordset

mrstMain.Open Table, mcnnMain, adOpenKeyset, adLockOptimistic, adCmdTable

If Not (mrstMain.BOF And mrstMain.EOF) Then mrstMain.MoveFirst

End If

Exit Sub

err_occur:

MsgBox "Ошибка при открытии базы данных."

End Sub

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

Теперь вы можете использовать компонент ownNavigator для доступа к любым таблицам выбранной вами базы данных.

Компонент ownSlider

До сих пор для отображения данных мы пользовались стандартными объектами типа TextBox. Создадим свой собственный компонент ownslider, который бы смог соединяться с объектом-источником (например, с созданным нами ownNavugator) и отображать данные, получаемые от него. При создании нового компонента не будем использовать стандартные компоненты типа command, TextBox или любых других. Все операции по отображению данных на экране возьмем на себя.

Созданный нами компонент будет отображать числовые значения в виде синей полоски, размер которой пропорционален значению value, получаемому из базы данных. Полоса будет занимать всю ширину объекта, когда value достигнет значения Limit. Кроме того, при установке фокуса на объекте ограничивающая его черная рамочка будет прорисовываться жирной линией, а при потере фокуса вновь становиться тонкой. Когда фокус находится на нашем компоненте ownsiider, мы сможем менять значение value с помощью клавиш-стрелок <<--> и <-->> на клавиатуре. При этом оно будет увеличиваться или уменьшаться на заданную величину Step.

Добавление компонента к проекту

Для добавления компонента к проекту в окне Project Group установите указатель на проекте ownControls и щелкните правой кнопкой мыши, затем выберите команду Add (Добавить) и затем значение UserControl. К нашему проекту будет добавлен еще один компонент. Назовите его ownslider. Откройте окно редактора кода и введите там следующий текст, описывающий необходимые свойства и переменные:

Dim rnlngValue As Long

Dim rnlngLimit As Long

Dim rnlngStep As Long

Public Property Get Value() As Long

Value = rnlngValue

End Property

Public Property Let Value(ByVal NewValue As Long)

If NewValue >= 0 Then rnlngValue == NewValue Else rnlngValue = 0

PaintView

PropertyChanged "Value"

End Property

Public Property Get Limit() As Long

Limit = rnlngLimit

End Property

Public Property Let Limit(ByVal NewLimit As Long)

If NewLimit > 0 Then rnlngLimit = NewLimit Else rnlngLimit = 1

PaintView

PropertyChanged "Limit"

End Property

Public Property Get Step() As Long

Step = rnlngStep End Property

Public Property Let Step(ByVal NewStep As Long)

If NewStep > 0 Then rnlngStep = NewStep Else rnlngStep = 1

PaintView

PropertyChanged "Step"

End Property

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)

Limit = PropBag.ReadProperty("Limit", 1000000)

Value = PropBag.ReadProperty("Value", 500000)

Step = PropBag.ReadProperty("Step", 1000)

End Sub

Private Sub UserControl WriteProperties(PropBag As PropertyBag)

PropBag.WriteProperty "Limit", Limit, 1000000

PropBag.WriteProperty "Value", Limit, 500000

PropBag.WriteProperty "Step", Step, 1000

End Sub

Private Sub UserControl_InitProperties ()

Limit = 1000000

Value = 500000

Step = 1000

End Sub

При изменении значения каждого из этих свойств запускается процедура перерисовки объекта:

Private Sub PaintView()

'установить позицию карандаша в верхний левый угол

CurrentX = 0

CurrentY = 0

'установить ширину линии в зависимости от признака фокуса

If HaveFocus Then DrawWidth = ScaleHeight / 50

Else DrawWidth = ScaleHeight / 500

'прорисовать белый прямоугольник по всей площади компонента

Line (0, 0)-(Width - 10, Height - 10), &H80000005, BF

'нарисовать синюю полоску в зависимости от значения Value

Line (0, 0)-((Value / Limit) * Width - 10, Height - 10), &H8000000D, BF

'отобразить значение Value в текстовой форме поверх изображения желтым цветом с контрастной черной тенью

ForeColor = &HO&

CurrentX = 10

CurrentY = Height /2-90

Print Value

ForeColor = &HFFFF&

CurrentX = 0

CurrentY = Height / 2 - 100

Print Value

'нарисовать ограничивающую рамку

Line (0, 0)-(Width - 10, Height - 10), &НО, В

End Sub

При возникновении события paint также следует вызывать перерисовку, так как это событие происходит всякий раз, когда системе требуется отобразить объект:

Private Sub UserControl_Paint()

PaintView

End Sub

Для контроля за фокусом предусмотрим переменную HaveFocus, значение которой будет устанавливаться при возникновении событий GotFocus и LostFocus. Таким образом, когда наш объект имеет фокус, значение переменной HaveFocus равно True, в противном случае HaveFocus имеет значение False.

Dim HaveFocus As Boolean

Private Sub UserControl_GotFocus()

HaveFocus = True

PaintView

End Sub

Private Sub UserControl_LostFocus()

HaveFocus = False

PaintView

End Sub

Чтобы обрабатывать нажатие клавиш <<--> и <-->>, установим в окне Properties для свойства Keypreview компонента значение True и опишем реакцию на событие KeyDown:

Private Sub UserControl KeyDown(KeyCode As Integer, Shift As Integer)

Select Case KeyCode

Case vbKeyLeft

Value = Value - Step

Case vbKeyRight

Value = Value + Step

End Select

End Sub

Как вы видите, нет необходимости заниматься перерисовкой, поскольку она автоматически происходит при присвоении нового значения свойству value.

Связывание с объектом-источником

Наш компонент уже почти готов. Осталось добавить для него возможность связываться с объектом-источником. Для этого необходимо создать свойство компонента ownSlider, которое будет определять параметры связи с базой данных. Для этого в меню Tools (Сервис) выберите команду Procedure Attributes (Атрибуты процедуры). Откроется диалоговое окно Procedure Attributes (рис. 17.41).

Из списка Name выберите свойство value, так как именно его мы собираемся связать с объектом-источником. Нажмите кнопку Advanced, чтобы получить возможность производить дополнительные настройки. Установите флажки Property is data bound, This property binds to DataField и Update immediate.

В поле Desctiption введите описание свойства. Оно будет появляться в нижней части окна Properties.

Рис. 17.41. Диалоговое окно Procedure Attributes

Теперь удалите из формы тестового проекта компонент Text 11 и добавьте вместо него новый компонент ownsiiderl. Вы увидите, что у нашего компонента тоже появились свойства DataSourse, DataMember И DataField.

Для свойства DataSource выберите значение ownNavigatorl, для свойства DataMember — значение Main, а для DataField — Creuitlimit.

Запустите приложение. Теперь вы можете видеть созданный компонент в действии (рис. 17.43).

Однако, если вы попробуете изменить значение компонента с помощью клавиш-стрелок, вас ждет разочарование. Значения будут меняться, но не будут заноситься в базу данных. Чтобы проверить это, перейдите к следующей строке и вернитесь назад. Все дело в том, что мы не сообщили объекту-источнику, что значение, хранимое нашим объектом ownsiider, было изменено пользователем и отличается от того значения, что получено из базы данных, а следовательно, имеется необходимость в корректировке записи. Чтобы устранить этот недостаток, измените код события KeyDown так, как показано ниже:

Private Sub UserControl_KeyDown(KeyCode As Integer, Shift As Integer)

Select Case KeyCode

Case vbKeyLeft

Value = Value — Step

Extender.DataChanged = True

Case vbKeyRight

Value = Value + Step

Extender.DataChanged = True

End Select

End Sub

Здесь мы в объекте Extender, относящемся к ownslider, устанавливаем признак того, что данные были изменены. Объект-источник опрашивает Extender и получает необходимую информацию. Теперь, если вы запустите приложение, то убедитесь, что все в полном порядке.

Рис. 17.43. Форма в режиме выполнения

назад | содержание | вперед

Hosting uCoz