назад | содержание
| вперед
Добавление и удаление столбцов
В первую очередь необходимо добавить в элемент 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 (Клавиатура) (рис. 17.29) устанавливает свойства, которые непосредственно связаны с клавишами клавиатуры.
Рис. 17.29. Вкладка Keyboard диалогового окна Property Pages элемента DataGrid
В левой части вкладки расположены флажки, которые управляют перемещением курсора. Их названия совпадают с одноименными свойствами элемента управления:
Флажок |
Назначение |
AllowArrows |
Данный флажок в установленном состоянии позволяет использовать клавиши-стрелки для передвижения по строкам и столбцам |
TabAccrossSplits |
Если установить этот флажок, то при работе с элементом DataGrid перемещение между разделами будет осуществляться с помощью клавиши <ТаЬ> |
WrapCellPointer |
При установке этого флажка перемещение курсора с заключительного символа последнего столбца осуществляется в первый столбец следующей строки. В противном случае курсор остается в текущей строке и столбце |
Раскрывающийся список TabAction определяет свойство с таким же найме нованием, которое обуславливает поведение курсора при использовании клавиши <ТаЬ>. Это свойство может принимать следующие значения:
Значение |
Описание |
dbgControlNavigation |
При нажатии на клавишу <ТаЬ> курсор будет переходить от одного элемента к другому |
dbgColumnNavigation |
Если выбрать это значение, то с помощью клавиши <ТаЬ> курсор будет переходить между столбцами элемента DataGrid. При нажатии клавиши <ТаЬ> в последнем столбце курсор перейдет в следующий элемент, расположенный в форме |
dbgGridNavigation |
С помощью клавиши <ТаЬ> курсор будет перемещаться по столбцам, но при достижении последнего столбца курсор не покинет элемент DataGrid, а будет себя вести, как описано в свойстве WrapCellPointer |
Вкладка Columns (Столбцы) (рис. 17.30) используется для настройки следующих параметров столбцов:
1. В раскрывающемся списке Column, содержащем перечень всех доступных столбцов элемента DataGrid, пронумерованных начиная с нуля, выбрать настраиваемый столбец.
2. В поле ввода Caption ввести заголовок столбца.
3. Теперь необходимо связать столбец с полем результирующего множества. Для этого используется раскрывающийся список DataField. В этом списке находятся все доступные для работы поля объекта corranand, который был выбран нами ранее в качестве источника данных. Выберите из этого списка поле, с которым связывается текущий столбец.
Рис. 17.30. Вкладка Columns диалогового окна Property Pages элемента DataGrid
После настройки одного столбца можно повторить все шаги для последующих столбцов. Завершив настройку всех столбцов, нажмите кнопку Применить, и все изменения будут сохранены.
Вкладка 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 (Цвет) (рис. 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 (Шрифт) (рис. 17.33) используется для настройки шрифтов
элемента DataGrid.
Значение Font списка Properties устанавливает шрифт для отображения информации в столбцах, a HeadFont — шрифт для заголовков столбцов.
Раскрывающиеся списки Font и Size позволяют определить соответственно наименование шрифта и его размер. Флажки Bold, Italic, Underline и Strikeout устанавливают начертание шрифта: полужирный, курсив, подчеркнутый и зачеркнутый.
Рис. 17.33. Вкладка Font диалогового окна Property Pages
Внешний вид текста, который получается в результате всех изменении, можно просмотреть в поле ввода Sample Text.
Вкладка Splits (Разделы) (рис. 17.34) предназначена для определения свойств разделов. Для того чтобы установить свойства для раздела, выберите настраиваемый раздел в раскрывающемся списке Split.
Рис. 17.34. Вкладка Splits диалогового окна Property Pages
В левой части вкладки расположены флажки следующего назначения:
Флажок |
Назначение |
Locked |
При установке флажка содержание столбцов, размещенных в разделе, предназначено только для чтения |
AllowFocus |
Разрешает установку фокуса на раздел |
AllowSizing |
При установке флажка размер раздела можно изменять в режиме выполнения формы |
AllowRowSizing |
При установке флажка можно изменять высоту строк в режиме выполнения формы |
RecordSelectors |
При установке флажка в разделе будет отображаться индикатор строки |
Поле ввода ScrollGroup определяет синхронизацию полос прокрутки для нескольких разделов. Если во всех разделах свойство ScrollGroup имеет одинаковое значение, то вертикальная полоса прокрутки одного раздела автоматически перемещает индикатор строки во всех этих разделах. Если для разделов данное свойство будет иметь различные значения, то в разделах будут отображаться данные из разных областей базы данных.
Раскрывающийся список ScrollBars определяет способ отображения полос прокрутки:
Раскрывающийся список MarqueeStyle позволяет задать способ выделения выбранной ячейки.
Параметры области, расположенной в нижней части вкладки, служат для определения размеров разделов. С помощью списка SizeMode задается способ установления размеров разделов, в нем содержатся следующие значения:
Значение |
Описание |
dbgScalable |
Размеры разделов пропорциональны между собой. Пропорция задается с помощью свойства size каждого раздела |
dbgExact |
Для того чтобы задать размер раздела точным числом, выберите это значение списка и введите в поле Size нужный размер |
Вкладка 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 для доступа к любым таблицам выбранной вами базы данных.
До сих пор для отображения данных мы пользовались стандартными объектами типа 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