Управление данными.

В настоящей главе обсудим создание форм для ввода и редактирования данных с использованием компонентов ADO (ActiveX Data Object). Технология ADO является новейшим средством доступа к различным типам данных, которую рекомендуется применять при разработке приложений в Visual Basic 6.0.
ADO позволяет программе получить доступ к базе данных с помощью провайдера OLE DB, который представляет собой интерфейс, обеспечивающий доступ к различным источникам данных.
При использовании ADO нам встретятся две основные группы объектов.

  • Элементы управления данными. Элемент ADO Data control используется для непосредственного подключения к базе данных. С помощью этого объекта можно достаточно легко подключиться к базе данных любого типа.
  • Элементы объектного интерфейса. Библиотека ADO предоставляет в ваше распоряжение большой выбор объектов для работы с данными. В список входят такие объекты, как таблица, список, раскрывающийся список и т. д.

Замечание
Следует отметить, что управлять данными можно непосредственно с помощью программного кода или использовать обычные элементы управления Visual Basic.
Подключение компонентов ADO к проекту
Чтобы использовать компоненты ADO в проекте, необходимо подключить библиотеки, которые их содержат. Для этого вам необходимо в меню Project (Проект) выбрать команду References (Ссылки), а затем в диалоговом окне References ( 1) установить флажки рядом с наименованиями следующих библиотек:

  • Microsoft ActiveX Data Objects 2.1 Library;
  • Microsoft ActiveX Data Objects Recordset 2.1 Library.

Для того чтобы использовать элементы управления, которые применяю! технологию ADO при создании и редактировании форм, необходимо эти компоненты поместить на панель инструментов. Для этого в меню Project (Проект) выберите команду Components (Компоненты) и в диалоговом окне Components установите флажки рядом с именами следующих компонентов:

  • Microsoft ADO Data Control 6.0 (OLEDB);
  • Microsoft DataGrid Control 6.0 (OLEDB);
  • Microsoft DataList Controls 6.0 (OLEDB);
  • Microsoft Hierarchical FlexGrid Control 6.0 (OLEDB).

 
Элемент управления ADO Data Control
В Visual Basic появился новый объект для управления данными — ADO Data control, который имеет непосредственную связь с набором записей и позволяет пользователю перемещаться по нему в любом направлении.
На  2 показан размещенный в форме элемент управления ADO Data Control. Он состоит из пяти объектов, представленных в табл. 17.1.
Таблица 17.1. Объекты, входящие в состав элемента управления ADO Data Control
Элемент управления ADO Data Control обладает свойствами, описанными в табл. 17.2.
Таблица 17.2. Свойства элемента управления ADO Data Control
Элемент управления ADO Data control характеризуется событиями, описанными в табл. 17.3.
Таблица 17.3. События элемента управления ADO Data Control



Соединение элемента с источником данных
Для соединения элемента управления ADO Data Control с источником данных используется свойство ConnectionString диалогового окна Properties (Свойства). Чтобы ввести информацию в это свойство, нажмите кнопку с тремя точками в правом столбце свойства. Откроется диалоговое окно Ргоperty Pages ( 3), в котором можно будет настроить соединение с источником данных тремя способами, используя:

  • файл Data Link;
  • источник данных ODBC;
  • строки соединения с источником данных. Если вы хотите настроить соединение с источником данных с помощью файла Data Link, то вам необходимо выбрать опцию Use Data Link File и с помощью кнопки Browse выбрать в диалоговом окне Open нужный файл.

Для соединения с источником данных с помощью ODBC установите опцию Use ODBC Data Source Name и в раскрывающемся списке выберите требуемый источник данных ODBC. Если в списке отсутствует источник данных, который вы хотели бы использовать, то нажмите кнопку New для вызова мастера настройки нового источника данных ODBC.
Третий способ настройки соединения с источником данных подразумевает непосредственный ввод строки соединения. Для использования строки соединения с источником данных выберите опцию Use Connection String и введите вручную текст строки в расположенное под опцией поле. Для формирования строки соединения служит диалоговое окно Data Link Properties (Свойства связи с данными) ( 4), которое открывается при нажатии на кнопку Build, расположенную справа от поля ввода.
Диалоговое окно Data Link Properties содержит четыре вкладки. На вкладке Privider (Поставщик услуг) в списке OLE DB Privider(s) (Поставщики OLE DB) вам необходимо выбрать поставщика услуг данных. Для продолжения настройки нажмите кнопку Next (Далее) или выберите вкладку Connection (Подключение) ( 5), на которой вы можете настроить соединение.
Замечание
Для каждого поставщика данных параметры для настройки соединения различны. В качестве примера рассмотрим вариант для настройки соединения с базой данных SQL Server 7.0.
Как видно из рисунка, в первую очередь надо выбрать из раскрывающегося списка наименование сервера баз данных. После этого необходимо ввести информацию о пользователе, которая включает в себя псевдоним пользователя и пароль. Последним этапом настройки соединения будет выбор базы данных из раскрывающегося списка или путем ввода имени базы данных в поле ввода.
На вкладке Advanced (Дополнительно) ( 6) размещены дополнительные параметры для настройки соединения с источником данных.
В области Network settings (Параметры сети) вкладки Advanced расположены следующие раскрывающиеся списки:
В области Other (Другое) вкладки Advanced размещены дополнительные параметры настройки соединения. Поле ввода Connect timeout (Время ожидания соединения) устанавливает промежуток времени, через который после начала соединения попытка соединения прекращается.
С помощью списка Access permissions (Права доступа) можно установить ограничения для работы с данными.
На вкладке All (Все) ( 7) диалогового окна Data Link Properties предоставляется возможность изменять все свойства, которые допустимы для выбранного поставщика данных.
Для изменения параметра выполните следующие действия:
1. Выберите свойство, которое необходимо изменить.
2. Нажмите кнопку Edit Value (Изменить значение), расположенную в нижней части диалогового окна.
3. В открывшемся диалоговом окне Edit Property Value (Изменение значения свойства) введите значение свойства в поле Property Value (Значение свойства).
4. После изменения значения свойства нажмите кнопку ОК. Для отмены изменений нажмите кнопку Cancel (Отмена).
Определение источника записей
После того как для элемента управления ADO Data control было настроено соединение с источником данных, можно приступить к определению источника записей. Для этого в диалоговом окне Property Pages элемента управления ADO Data Control перейдите сначала на вкладку Authentication ( 8), и введите имя пользователя и пароль для активизации соединения с источником данных.
Затем можно непосредственно перейти к настройке источника записей, воспользовавшись вкладкой RecordSource (Источник записи) ( 9) диалогового окна Property Pages.
Использование элемента ADO Data Control в форме
Рассмотрим использование элемента ADO Data Control в форме. Для этого выполните следующие действия:
1. Откройте новый проект.
2. Разместите в форме проекта элемент управления ADO Data control. Для этого дважды щелкните кнопку Adodc ¦Я на панели элементов управления.
3. Настройте соединение с источником данных для элемента управления ADO Data Control, как это было описано выше.
4. После настройки соединения с источником данных перейдите к настройке источника записей. Для этого вызовите диалоговое окно Property Pages для элемента ADO Data control. Перейдите на вкладку RecordSource и в раскрывающемся списке Command Type выберите значение adCmdTable. Из списка Table or Stored Procedure Name (Наименование таблицы или хранимой процедуры) выберите таблицу Customer с информацией о клиентах.
5. После настройки элемента ADO Data Control можно приступить к размещению в форме элементов управления для отображения данных из таблицы. Для удобства рекомендуется располагать элементы таким образом, чтобы пользователю было удобно работать с формой. На  10 показано размещение элементов для просмотра информации о покупателях.
6. Далее необходимо связать элементы отображения данных с элементом ADO Data control. Для каждого элемента управления выполните следующие действия:

  • выберите элемент, который необходимо связать с источником записей;
  • в окне Properties выбранного элемента из раскрывающегося списка свойства DataSource (Источник данных) выберите элемент ADO Data control, который был размещен на форме;
  • после того как элемент связан с источником записей, необходимо связать его с полем таблицы. Для этого используйте свойство DataField (Поле данных), из списка которого выберите требуемое поле таблицы.

7. После завершения настройки всех элементов формы, запустите проект на выполнение и просмотрите полученный результат ( 11).
Использование окружения данных при создании формы
Гибким и удобным способом соединения с источником данных является использование в проекте окружения данных (Data Environment). Основное его преимущество заключается в том, что при необходимости изменения параметров соединения с базой данных вам будет достаточно изменить эти параметры в окружении данных для объекта connection, и все объекты Command, связанные с ним, будут учитывать эти изменения. Если же в каждой форме настроено отдельное соединение, то вам придется исправлять изменившиеся параметры во всех формах.
Для создания окружения данных в проекте выполните команду Add Data Environment (Добавить окружение данных) меню Project (Проект). На экране появится конструктор для редактирования окружения данных ( 12).
Автоматически в окружении данных создается объект Connection, представляющий собой соединение с источником данных. Настройка соединения осуществляется так же, как и для элемента управления ADO Data control.
После того как соединение подготовлено, можно приступить к созданию объекта command. Данный объект можно создать двумя способами.

  • Выберите соединение и нажмите кнопку Add Command на панели инструментов окна DataEnvironment. В папке Commands появится новая команда с активным соединением, которое было выбрано.
  • Установите курсор на папку Commands, нажмите правую кнопку мыши и выберите из появившегося контекстного меню команду Add Command. Настройка объекта Command

Настройка параметров объекта command в общем похожа на настройку источника записей для ADO Data control. Различие состоит в том, что при настройке параметров для объектов Command предоставляется возможность определять большее количество параметров.
Для вызова диалогового окна Свойства ( 13) объекта command выполните следующие действия:
1. Выберите определяемый объект Command.
2. Нажмите правую кнопку мыши и выберите из контекстного меню команду Properties (Свойства).
В поле ввода Command Name задается наименование объекта command. Раскрывающийся список Connection позволяет указать соединение, с помощью которого объект получает доступ к источнику данных.
В области Source of Data расположен переключатель, позволяющий указать источник записей. Если выбрана опция Database Object, то в одноименном раскрывающемся списке можно выбрать один из объектов базы данных.
После того как задан тип объекта базы данных, необходимо с помощью раскрывающегося списка Object Name (Имя объекта) выбрать имя объекта.
Иногда приходится сталкиваться с ситуациями, когда невозможно использовать ни один из выше перечисленных объектов базы данных. В таком случае в диалоговом окне предоставляется возможность для самостоятельного написания текста команды. Для этого вам необходимо в области Source of Data выбрать опцию SQL Statement и в поле редактирования SQL Statement ввести текст команды.
Вкладка Parameters
Вторая вкладка диалогового окна Свойства имеет название Parameters (Параметры) ( 14) и используется для задания параметров выбранной команды.
В области Parameters вкладки расположен список всех параметров. В правой части вкладки Parameters расположена область Parameters Properties, содержащая поля для определения хранимых процедур.

Вкладка Relation
На вкладке Relation (Связь) ( 15) предоставляется возможность для установления соединения с родительским объектом command.
Для создания соединения необходимо установить флажок Relate to a Parent Command Object (Связь с родительским объектом command), расположенный в верхней части вкладки. Раскрывающийся список Parent Command предназначен для выбора вышестоящего объекта command, с которым связывается текущий объект.
В области Relation Definition (Определение связи) расположены параметры для настройки соединения.
Для добавления нового соединения выполните следующие действия:
1. Из раскрывающегося списка Parent Fields выберите поле вышестоящего Объекта Command.
2. Из списка Child Fields/Parameters выберите поле текущего объекта command.
3. Нажмите кнопку Add. Новое соединение добавляется в список, располагающийся в нижней части вкладки.
Если вам необходимо удалить соединение, то для этого выберите соединение и нажмите кнопку Remove.
Вкладка Grouping
Вкладка Grouping (Группировка) используется для определения группировки данных.
Флажок, расположенный в верхней части вкладки, в установленном состоянии позволяет выбрать поля, по которым будет осуществляться группировка. Поле Grouping Command Name области Grouping Definition (Определение группировки) позволяет задать наименование группировки для объекта command.
В списке Fields in Command размещены все доступные для группировки поля, а в списке Fields Used for Grouping — поля, по которым будет осуществляться группировка данных. Между списками расположены кнопки, позволяющие перемещать поля из одного списка в другой.
 
Вкладка Aggregates
Для получения итоговых значений по отдельным полям объекта command используется вкладка Aggregates.
Область Aggregates позволяет сформировать список переменных, являющихся итоговыми значениями. Под списком расположены две кнопки. Кнопка Add добавляет в список новую переменную, a Remove — удаляет выделенную в списке переменную.
В области Aggregate Settings вкладки расположены поля, предназначенные для настройки параметров переменной. В поле Name задается наименование переменной. Раскрывающийся список Function содержит список функций, используемых для вычисления следующих итоговых значений:

  • Any — значение поля;
  • Average — среднее значение поля;
  • Count — количество строк;
  • Maximum — максимальное значение поля;
  • Minimum — минимальное значение поля;
  • Standard Deviation — стандартное отклонение значения поля;
  • Sum — сумма значении поля.

Раскрывающийся список Aggregate on содержит два значения. При выборе значения Grouping значение переменной вычисляется по группе. Выбор значения Grand Total указывает на необходимость вычисления по всей выборке.
Из раскрывающегося списка Field можно выбрать поле объекта, по которому будет вычисляться итоговое значение.
После завершения настройки для сохранения всех изменений необходимо нажать кнопку Применить.
Вкладка Advanced
Вкладка Advanced используется для настройки дополнительных параметров объекта command.
В области Recordset Management вкладки расположены параметры для настройки источника записей.
Раскрывающийся список Cursor Type (Тип курсора) предназначен для установки типа курсора.
Замечание
Список Cursor Type доступен только при использовании курсора, размещенного на сервере.
Для выбора способа размещения курсора (на сервере или на клиенте) используется раскрывающийся список Cursor Location (Расположение курсора).
При работе с записями существует возможность блокировки отдельных записей при редактировании. Чтобы установить тип блокировки, используется раскрывающийся список Lock Type (Тип блокировки), в котором находятся следующие варианты блокировок:
 
В поле ввода Cache Size (Размер кэша) устанавливается размер кэша для объекта Command. По умолчанию устанавливается размер в 10 записей.
Для того чтобы объект command возвращал результирующее множество, необходимо установить флажок Recordset Returning.
Для настройки конфигурации объекта command используются параметры, расположенные в области Command Configuration:
 
Область Advanced содержит поле ввода Call Syntax, которое позволяет использовать ADO для вызова хранимых процедур. Это может служить для увеличения количества параметров или установки значений параметров.
Размещение полей объекта Command в форме
Объект command удобно использовать при создании форм, предназначенных для просмотра и редактирования данных. Для создания формы редактирования списка покупателей выполните следующие действия:
1. Создайте в окружении данных новый объект Command. Выберите активное соединение для команды.
2. Настройте объект command таким образом, чтобы он выбирал данные из отдельной таблицы. В нашем случае это будет таблица Customer (Список покупателей).
3. Откройте форму проекта, в которой будете размещать поля объекта Command.
4. Для размещения в форме полей необходимо выбрать объект Command в окружении данных ( 19), нажать левую кнопку мыши и, удерживая ее в нажатом состоянии, перенести в форму. После чего отпустить кнопку мыши.
На  20 показан результат расположения полей в форме. Нужно отметить, что все размещенные объекты будут автоматически связаны с объектом Command. После запуска формы на выполнение можно увидеть, что форма успешно отображает данные из таблицы базы данных ( 21).
Использование элемента ADO Data Control для перемещения по данным
В форме, созданной с использованием объекта Command и представленной на  21, отсутствуют объекты управления перемещением по записям таблицы. Для управления передвижением курсора по записям таблицы подходит элемент управления ADO Data Control. Для добавления этого элемента в созданную нами с помощью объекта command форму выполните следующие действия:
1. Разместите в форме элемент управления ADO Data Control.
2. Для того чтобы связать элемент ADO Data control с результирующим множеством, полученным с помощью объекта command, добавьте в код обработки события Form_Activate для формы следующую строку кода:
Set adoCustomer.Recordset = deSales.rscomCustomer
3. После этого сохраните форму и запустите ее на выполнение. Результат представлен на  22.
Замечание
В код обработки события для формы мы добавили присвоение для результирующего множества элемента ADO Data Control. В качестве результирующего множества, которое возвращает набор записей, мы взяли rscomCustomer из окружения данных deSales. Результирующее множество rscomCustomer автоматически создается при выполнении объекта Command comCustomer.
Настройка элемента ADO Data Control для отображения номера покупателя
Для наглядности при перемещении по записям таблицы можно в заголовке элемента ADO Data control отображать номер текущей записи. Для этого вам будет достаточно выполнить следующие действия: *
1. Откройте окно редактора кода для элемента ADO Data control.
2. Выберите событие MoveCompiete и добавьте в него следующий код:
adoCustomer.Caption = Покупатель №: &
CStr(adoCustomer.Recordset.AbsolutePosit ion)
3. После этого сохраните форму и запустите ее на выполнение. Результат показан на  23.
Одновременная работа с несколькими записями
Чтобы работать одновременно с несколькими записями, в Visual Basic 6 представлены следующие элементы:
Использование элемента DataGrid
Как было сказано выше, элемент DataGrid предоставляет возможность просмотра и редактирования нескольких записей из источника данных. Для создания формы, которая будет использовать элемент DataGrid, выполните следующие действия:
1. Откройте форму, с помощью которой хотите просматривать информацию из источника данных.
2. Разместите в ней элемент управления DataGrid ( 24). Для этого дважды щелкните кнопку DataGrid на панели элементов управления.
3. Для свойства DataSource (Источник данных) выберите окружение данных, элемент ADO Data control или результирующее множество Recordset, объявленное в форме.
4. В том случае, если в свойстве DataSource было выбрано окружение данных, то с помощью свойства DataMember вам необходимо выбрать объект Command, который вы хотите использовать в форме.
После выполненных действий форма уже является работоспособной, т. к. при запуске формы автоматически будут созданы все необходимые столбцы для отображения данных.
Но в данном случае используются не все возможности элемента DataGrid, рассмотрим их.
Добавление и удаление столбцов
В первую очередь необходимо добавить в элемент DataGrid необходимое количество столбов. Для добавления нового столбца выполните следующие шаги:
1. Выберите элемент DataGrid.
2. Нажмите правую кнопку мыши и выберите из контекстного меню команду Edit (Правка). Объект переходит в режим редактирования.
3. Для добавления нового столбца можно использовать команду Insert, которая добавит новый столбец перед тем столбцом, на который был установлен курсор мыши перед вызовом контекстного меню. Если вам необходимо добавить новый столбец в конец таблицы, то выполните команду Append контекстного меню.
Удаление столбца из объекта DataGrid выполняется аналогично добавлению. Сначала необходимо перевести объект в режим редактирования, затем установить курсор на удаляемый столбец и выбрать из контекстного меню команду Delete.
На  26 показана форма с элементом управления DataGrid, в который добавлены столбцы.
Использование разделов
Элемент управления DataGrid позволяет разбить таблицу, содержащую данные, на несколько разделов, настраиваемых отдельно.
Для добавления нового раздела перейдите в режим редактирования элемента DataGrid, выбрав команду Edit контекстного меню, а затем выберите из этого же меню команду Split. Если вам потребуется удалить раздел, то воспользуйтесь командой Remove.

Настройка параметров элемента DataGrid с помощью диалогового окна Property Pages
Для настройки всех параметров элемента DataGrid удобнее всего использовать диалоговое окно Property Pages ( 28), которое вызывается командой Properties контекстного меню.
Вкладка General (Основные) предназначена для настройки основных свойств элемента DataGrid. Поле ввода Caption содержит заголовок элемента, который будет отображаться в его верхней части. В левой части вкладки расположена область, содержащая флажки следующего назначения:
В правой части вкладки General диалогового окна Property Pages расположены поля и списки, которые устанавливают значения одноименных свойств элемента управления:
Вкладка Keyboard
Вкладка Keyboard (Клавиатура) ( 29) устанавливает свойства, которые непосредственно связаны с клавишами клавиатуры.
В левой части вкладки расположены флажки, которые управляют перемещением курсора. Их названия совпадают с одноименными свойствами элемента управления:
Раскрывающийся список TabAction определяет свойство с таким же найме нованием, которое обуславливает поведение курсора при использовании клавиши <ТаЬ>. Это свойство может принимать следующие значения:
Вкладка Columns
Вкладка Columns (Столбцы) ( 30) используется для настройки следующих параметров столбцов:

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

1. В раскрывающемся списке Column, содержащем перечень всех доступных столбцов элемента DataGrid, пронумерованных начиная с нуля, выбрать настраиваемый столбец.
2. В поле ввода Caption ввести заголовок столбца.
3. Теперь необходимо связать столбец с полем результирующего множества. Для этого используется раскрывающийся список DataField. В этом списке находятся все доступные для работы поля объекта corranand, который был выбран нами ранее в качестве источника данных. Выберите из этого списка поле, с которым связывается текущий столбец.
После настройки одного столбца можно повторить все шаги для последующих столбцов. Завершив настройку всех столбцов, нажмите кнопку Применить, и все изменения будут сохранены.
 
Вкладка Layout
Вкладка Layout (Расположение) ( 31) используется для настройки внешнего вида столбцов каждого из разделов.
Раскрывающийся список Split содержит все доступные для данного элемента DaraGrid разделы, а список Column — столбцы, входящие в текущий раздел. Для разных разделов, а также столбцов можно определить свой внешний вид с помощью флажков и полей, расположенных на вкладке.
В левой части вкладки расположены флажки, предназначенные для установки значений одноименных свойств:
Раскрывающийся список DividerStyle устанавливает свойство DividerStyle для отдельного столбца. Данное свойство предназначено для определения правой границы столбца.
С помощью раскрывающегося списка Alignment можно задать выравнивание информации в столбце. Список содержит следующие значения:
Поле ввода Width предназначено для определения ширины столбца.
 
Вкладка Color
На вкладке Color (Цвет) ( 32) вы можете установить цвета, которые определяют внешний вид вашего элемента DataGrid.
В списке Properties находятся объекты, которые могут быть изменены. Значение BackColor определяет цвет фона для столбцов элемента DataGrid, a ForeColor — цвет текста в столбцах.
Раскрывающийся список Color Set содержит список доступных цветовых схем. Значение Standard Colors определяет стандартную цветовую схему, a Windows System Colors — цветовую схему системы Windows.
Кнопка Edit Custom Color предназначена для настройки нового цвета.
Вкладка Font
Вкладка Font (Шрифт) ( 33) используется для настройки шрифтов
элемента DataGrid.
Значение Font списка Properties устанавливает шрифт для отображения информации в столбцах, a HeadFont — шрифт для заголовков столбцов.
Раскрывающиеся списки Font и Size позволяют определить соответственно наименование шрифта и его размер. Флажки Bold, Italic, Underline и Strikeout устанавливают начертание шрифта: полужирный, курсив, подчеркнутый и зачеркнутый.
Внешний вид текста, который получается в результате всех изменении, можно просмотреть в поле ввода Sample Text.
Вкладка Splits
Вкладка Splits (Разделы) ( 34) предназначена для определения свойств разделов. Для того чтобы установить свойства для раздела, выберите настраиваемый раздел в раскрывающемся списке Split.
В левой части вкладки расположены флажки следующего назначения:
Поле ввода ScrollGroup определяет синхронизацию полос прокрутки для нескольких разделов. Если во всех разделах свойство ScrollGroup имеет одинаковое значение, то вертикальная полоса прокрутки одного раздела автоматически перемещает индикатор строки во всех этих разделах. Если для разделов данное свойство будет иметь различные значения, то в разделах будут отображаться данные из разных областей базы данных.
Раскрывающийся список ScrollBars определяет способ отображения полос прокрутки:

  • dbgNone — полоса прокрутки отсутствует;
  • dbgHorizontal — только горизонтальная полоса прокрутки;
  • dbgVertical — только вертикальная полоса прокрутки;
  • dbgBoth — горизонтальная и вертикальная полосы прокрутки;
  • dbgAutomatic — полосы прокрутки появляются только при необходимости.

Раскрывающийся список MarqueeStyle позволяет задать способ выделения выбранной ячейки.
Параметры области, расположенной в нижней части вкладки, служат для определения размеров разделов. С помощью списка SizeMode задается способ установления размеров разделов, в нем содержатся следующие значения
Вкладка Format
Вкладка Format (Формат) ( 35) предназначена для определения формата отображения данных в столбцах. В раскрывающемся списке Format
Item выбирается настраиваемый столбец и с помощью списка Format Type устанавливается тип данных.
Создание компонентов ActiveX для управления данными
В начале главы мы рассмотрели создание приложений с использованием компонентов ADO (ActiveX Data Object). Однако иногда вас могут не устраивать предлагаемые стандартные средства. Это может быть в том случае, если создаваемое приложение имеет специфические особенности, а также, если вы хотите унифицировать элементы интерфейса и использовать их в нескольких формах, а может быть и в нескольких приложениях. Решением в подобной ситуации становится создание собственных ActiveX-компонентов. В данном разделе рассмотрим несколько примеров создания таких компонентов.
Создание компонента ownNavigator
Создадим ActiveX-компонент, который может являться источником данных для других компонентов и использоваться для перемещения по записям в базе данных и осуществления простейших операций по модификации ее содержимого. Для создания ActiveX-компонента откройте новый проект типа ActiveX Control. Он будет содержать единственный ActiveX-компонент — userControll. Присвойте проекту имя ownDataControls, а компоненту — ownNavigator.
Размещение элементов управления
ActiveX-компонент будем создавать на основе стандартных элементов управления. Добавьте в него шесть кнопок управления и задайте для них приведенные ниже значения свойств Name и caption.
Осуществление доступа к данным
Теперь надо определить средства доступа к данным. Для этих целей будем использовать технологию 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 ( 37).
Теперь необходимо определить действия, выполняемые при инициализации объекта и при его уничтожении:
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, как показано на  38.
В окне Properties элементов управления типа TextBox выберите свойство DataSource и раскройте список доступных объектов-источников. В нем появился добавленный в форму объект ownNavigatorl — экземпляр созданного нами элемента управления. Выберите его. Затем установите для свойства DataMember значение Main. На следующем шаге выберите для каждого элемента управления типа TextBox поле результирующей выборки.
Предупреждение
Если вы не позаботитесь о том, чтобы Recordset открывался сразу при инициализации объекта на этапе проектирования, то не будете иметь возможности выбирать поля среди доступных в Recordset.
Настройте соответствующим образом свойства caption объектов типа Label.
Назначьте проект Testproject основным проектом группы. Для этого выберите его в окне Project Group, нажмите правую кнопку мыши'и выберите из контекстного меню команду Set as Start Up ( 39) Имя проекта при этом выделится жирным шрифтом.
Теперь запустите созданный проект на выполнение. Для этого выполните команду Start меню Run или нажмите клавишу <F5>. Созданная нами форма просмотра данных из таблицы Customer приведена на  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 для доступа к любым таблицам выбранной вами базы данных.

 

 

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г. Яндекс.Метрика