Окно списка (List box), комбинированное окно (Combo box), Контейнер OLE (OLE container), связанное окно списка (Data-bound list box) и связанное комбинированое окно (Data-bound combo box).
3. Data-bound list box и Data-bound combo box.
Окна списка и комбинированные окна удобно использовать когда необходимо предоставить возможность пользователю выбирать элемент из списка. Кроме того, с помощью комбинированного окна пользователь может добавить элемент в список. На панели инструментов Visual Basic окно списка и комбинированное окно изображены пиктограммами и . Как и все обычные элементы управления Visual Basic окна списка и комбинированные окна связываются с базой данных установкой свойств DataSource и DataField.
Заполнение списков проводится при помощи метода AddItem или установкой свойства List.
Построим простое приложение для демонстрации использования списка и комбинированного списка. Положим, что у нас есть база данных PRODUCTS.MDB для учета товаров, единственная таблица которой PRODUCTS содержит поля, как показано в таблице .
Таблица. Структура таблицы PRODUCTS
Поле | Тип | Ширина поля | Описание |
Id | Text | 10 | Код товара |
Product | Text | 20 | Наименование товара |
Price | Text | 10 | Цена за единицу товара |
Depository | Text | 3 | Индикатор наличия товара на складе |
Note | Text | 50 | Примечание |
Текстовое поле Depository определяет наличие товара на складе и может содержать только одну из двух строк “Да” или “Нет”.
Создайте новый проект и расположите на форме объект управления данными, пять меток, четыре текстовых окна, командную кнопку, список и комбинированный список как показано на рис.8.1.
Рис.8.1. Расположение элементов управления на форме
В окне свойств объекта Data1 определите свойство Caption, как “Товары”, установите свойство DatabaseName как имя файла базы данных с указанием полного пути, например, C:\WORK\PRODUCTS.MDB и укажите в качестве источника данных имя таблицы PRODUCTS определением свойства RecordSource. Затем установите свойства меток, текстовых окон и командной кнопки, списка и комбинированного списка следующим образом:
Label1.Caption=Код товара
Label2.Caption=Наименование
Label3.Caption=Цена
Label4.Caption=Присутствие на складе
Label5.Caption=Примечание
Command1.Caption=Добавить
Text1.DataSource=Data1
Text1.DataField=Id
Text2.DataSource=Data1
Text2.DataField=Product
Text3.DataSource=Data1
Text3.DataField=Price
Text4.DataSource=Data1
Text4.DataField=Note
List1.DataSource=Data1
List1.DataField=Depository
Combo1.DataSource=Data1
Combo1.DataField=Depository
В процедуру обработки события нажатия кнопки добавьте код, который добавит пустую запись в набор записей и сделает ее текущей:
Private Sub Command1_Click()
Data1.Recordset.AddNew
End Sub
И наконец, в окне свойств списка и комбинированного списка определите свойство List добавив строки “Да” и “Нет”.
Запустите проект и добавьте записи в базу данных. Ввести значение в поле Depository можно выбрав “Да” или “Нет” в простом или комбинированном списке. При перемещении указателя текущей записи по набору записей в комбинированном списке будет отображаться “Да” или “Нет” в зависимости от содержимого поля Depository, в то время как в обычном списке значение поля будет выделяться подсветкой (рис.8.2).
Рис.8.2. Результат работы приложения
Применение объекта OLE container дает возможность не только размещать на экранной форме приложения различные OLE-объекты, хранящиеся в базе данных, но и редактировать их. В качестве OLE-объектов могу выступать например: рисунки, документы Microsoft Word, таблицы Microsoft Excel, звуковые фрагменты и видеоклипы и многое другое. Посмотреть, какие OLE-объекты вы имеете возможность разместить в своей базе данных можно, например, выполнив команду меню Вставка->Объект текстового процессора Microsoft Word. В появившемся окне будет находиться список всех объектов OLE, зарегистрированных в вашей системе (рис.8.3).
В своем приложении вы можете использовать либо внедренные (embedded) либо связанные (linked) объекты. Внедренные OLE-объекты содержат информацию как о самом объекте, так и о приложении его создавшем - OLE-сервере. Редактирование внедренного объекта можно проводить только с помощью приложения-клиента. В нашем случае это разрабатываемая СУБД. В отличие от внедренных, связанные OLE-объекты в базе данных сохраняют связь с объектом - оригиналом и любое изменение оригинала приведет к аналогичному изменению объекта, хранящегося в БД.
В базе данных формата MS Access внедренные объекты или ссылки на связанные объекты всегда хранятся в поле типа OLE Object. Понятно, что если вы создадите базу данных с документами Microsoft Word, то просматривать эту БД можно будет только на компьютере, на котором так же установлен этот текстовый процессор.
Рис.8.3. Список OLE-объектов, зарегистрированных в системе
Контейнер OLE связывается с базой данных установкой свойств DataSource и DataField и его пиктограмма на панели инструментов - .
Продемонстрируем использование элемента управления OLE-контейнер в приложениях. Для этого построим простую СУБД по управлению базой данных, содержащую OLE-объекты.
Положим, что у на есть база данных OLEOBJ.MDB, таблица которой OBJ содержит поля, как показано в таблице.
Таблица. Структура таблицы OBJ
Поле | Тип | Ширина поля | Описание |
Id | AutoNumber | 4 | Идентификатор объекта |
Desc | Text | 20 | Описание объекта |
Obj | OLE-object | Свыше 1 Гб | OLE-объект |
Создайте новый проект и расположите на форме объект управления данными, две метки, два текстовых окна, OLE-контейнер и командную кнопку, как показано на рис.8.4.
Рис.8.4. Расположение элементов управления на экранной форме
Установите свойства объекта управления данными следующим образом. Свойство Caption определите как “OLE объекты”, свойство DatabaseName установите как имя файла базы данных C:\WORK\DB.MDB и укажите в качестве источника данных (свойство RecordSource) имя таблицы OBJ. Затем установите свойства меток, текстовых окон, контейнера OLE и командной кнопки:
Label1.Caption=Идентификатор
Label2.Caption=Описание
Text1.DataSource=Data1
Text1.DataField=Id
Text2.DataSource=Data1
Text2.DataField=Desc
OLE1.DataSource=Data1
OLE1.DataField=Obj
Command1.Caption=Добавить
Запустите проект. Если ваша базе данных не пуста и в ней есть какие-либо записи с OLE-объектами (в данном случае с помощью MS Access созданы две записи с математическим уравнением и рисунком), вы увидите, что в OLE-контейнере отобразится содержимое поля Obj первой записи (рис.8.5).
Рис.8.5. Результат работы приложения
Внедренные объекты можно редактировать. Нажатие правой кнопки мыши на OLE-контейнере приведет к появлению всплывающего меню с двумя пунктами: “Изменить” и “Открыть”. Выбор первого пункта позволит вам редактировать содержимое OLE-контейнера прямо в вашей экранной форме, в то время как выбор второго - приведет к запуску приложения-сервера и загрузке в него содержимого OLE-контейнера (рис.8.6). В данном случае это будет редактор формул, входящий в поставку текстового процессора MS Word. После внесения необходимых изменений закройте приложение-сервер и убедитесь, что результаты редактирования отображены в базе данных.
Рис.8.6. Запуск приложения-сервера
Таким образом мы создали приложение, которое позволяет не только просматривать, но и редактировать OLE-объекты, хранящиеся в базе данных. Это могут быть совсем разные объекты: математические уравнения, рисунки, текстовые документы, таблицы, диаграммы и др.
В нашем приложении осталась незадействована командная кнопка “Добавить”. Очевидно, что она должна быть предназначена для добавления новых записей в базу данных. Добавим в процедуру обработки события нажатия этой кнопки код, который позволит нам добавлять пустую запись в конец набора записей:
Private Sub Command1_Click()
Data1.Recordset.AddNew
OLE1.InsertObjDlg
End Sub.
Метод InsertObjDlg OLE-контейнера отображает на экране диалоговое окно выбора типа объекта (рис.8.7). Отметив кнопку-переключатель Create New (Создать новый), вы можете вставить новый объект в базу данных, выбрав требуемый тип из списка зарегистрированных в системе объектов OLE. Выбор кнопки-переключателя Create from File (Создать из файла) позволит вам вставить в базу данных уже существующий на вашем жестком диске OLE-объект (рис.8.8). При этом вы можете установить связь между файлом-оригиналом и добавленным в базу данных объектом, отметив контрольный индикатор Link (Установить связь).
Рис.8.7. Диалоговое окно вставки объекта
Рис.8.8. Вставка объекта из файла
Теперь с помощью нашего приложения вы можете не только просматривать и редактировать OLE-объекты в базе данных, но и добавлять новые, предварительно выбрав его тип. Однако в базах данных хранятся, как правило, объекты одного типа. Для создания объекта требуемого типа можно использовать метод CreateEmbed объекта OLE-контейнер. Метод имеет следующий синтаксис:
object.CreateEmbed sourcedoc, class.
Объектное выражение object определяет имя объекта OLE-контейнера. Первый аргумент - sourcedoc является обязательным и определяет имя файла документа, используемого как шаблон для внедряемого объекта. Если вы не определяете этот файл, то необходимо задать этот аргумент в виде пустой строки “”. Второй аргумент - class не обязателен и определяет класс внедряемого объекта. Этот аргумент игнорируется, если определен параметр sourcedoc.
Когда вы создаете новый внедренный OLE-объект при помощи метода CreateEmbed, приложение-сервер, определяемое именем класса - class, должно быть корректно зарегестрировано в вашей системе. Посмотреть классы объектов можно выбрав в окне свойств OLE-контейнера свойство Class и нажав справа кнопку с тремя точками. Появится окно со списком всех зарегистрированных классов (рис.8.9).
Рис.8.9. Окно выбора класса
Свойство Class объекта OLE-контейнер определяет имя класса внедряемого объекта следующим образом:
application.objecttype.version
objecttype.version
где application определяет приложение, objecttype определяет тип объекта в библиотеке объектов приложения и version определяет номер версии. Например, электронная таблица MS Ecxel пятой версии поддерживает несколько объектов - рабочие листы (worksheets) и диаграммы (charts). Соответствующие имена классов - Excel.Sheet.5 и Excel.Chart.5.
Вернемся к нашему приложению. Несколько изменим код обработки события нажатия командной кнопки, для вставки математического выражения:
Private Sub Command1_Click()
Data1.Recordset.AddNew
OLE1.CreateEmbed "", "Equation.2"
End Sub
Теперь при нажатии кнопки “Добавить” в базу данных будут добавляться записи, содержащие математические уравнения, которые вы можете редактировать в окне OLE-контейнера на вашей экранной форме.
Связанное окно списка (Data-bound list box) и связанное комбинированое окно (Data-bound combo box)
Связанные с данными окно списка и комбинированное окно в отличие от своих обычных аналогов List и Combo box специально разработаны для использования в СУБД и их основное предназначение - упростить ввод или отображение на экранной форме информации из базы данных в виде списков.
По умолчанию пиктограммы этих элементов управления отсутствуют на панели инструментов Visual Basic. Чтобы их добавить, надо выполнить команду меню Project -> Components, выбрать из списка элементов управления (Controls) Microsoft data bound list controls и затем нажать кнопку OK (рис.8.10). К аналогичному результату приведет щелчок правой кнопкой мыши на панели инструментов. Последствием этих действий будет появление следующих пиктограмм: (связанный список) и (связанное комбинированное окно) на панели инструментов. Теперь вы можете добавлять эти объекты управления в проекты своих приложений просто отбуксировав их с панели инструментов на экранную форму.
Рис.8.10. Список элементов управления Visual Basic
Объекты управления Data-bound list box и Data-bound combo box имеют пять свойств, установка которых определяет их поведение как связанных с данными элементов управления. Краткое описание этих свойств приведено в таблице.
Таблица. Свойства связанного списка и связанного комбинированного окна
Свойство | Описание |
RowSource | Имя объекта управления данными, которое используется для заполнения списка. |
ListField | Имя поля в наборе записей, определенном свойством RowSource, которое используется для заполнения списка. |
DataSource | Имя объекта управления данными, с которым связывается список. |
DataField | Имя поля в наборе записей, определенном свойством DataSource. Это поле используется для определения, какой элемента списка выбран. После выбора элемента списка и перемещения указателя текущей записи на другую запись это поле будет обновлено. |
BoundColumn | Имя поля в наборе записей, определенном свойством RowSource, значение которого будет скопировано. |
Поля ,определяемые свойствами DataField и BoundColumn, должны быть одного типа.
Приведем пример простого приложения, в котором показано на практике как использовать связанные списки и связанные комбинированные окна для связи с данными.
Будем использовать базу данных FRIENDS.MDB, которая была создана ранее при демонстрации некоторых возможностей приложения VisData в первой главе. Эта база данных состоит из двух таблиц: PERSON, в которой находится персональная информация о ваших знакомых, и WORKPLACE, содержащая сведения об их местах работы или учебы. Связь между таблицами осуществляется на основании содержимого совпадающих полей Id_work.
В приложении реализуем функцию просмотра значений некоторых полей обоих таблиц в связанных текстовых окнах. Кроме того, предоставим пользователю возможность обновления данных о месте работы с помощью выбора подходящего элемента из связанного списка или связанного комбинированного окна. Понятно, что в этом случае выбор из списка возможных альтернатив может быть сделан только исходя из данных таблицы WORKPLACE.
Создайте новый проект и расположите на экранной форме два объекта управления данными, связанный список, связанное комбинированное окно, четыре метки и три текстовых окна, как показано на рис.8.11.
Рис.8.11. Расположение элементов управления на форме
В окне свойств первого объекта управления данными установите свойство DataBaseName как имя базы данных FRIENDS.MDB с указанием полного пути к файлу. Затем установите свойство RecordSource как PERSON. Использование кнопок со стрелками этого объекта управления даст возможность пользователю перемещаться от записи к записи в таблице PERSON. У второго объекта управления данными установите свойство DataBaseName аналогичным образом и определите источник записей как следующий SQL-запрос:
SELECT Id_work, Office FROM WORKPLACE ORDER BY Id_work.
В результате выполнения этого запроса будет создан набор записей, содержащий значения полей Id_work и Office, и упорядоченный по полю Id_work. В принципе, второй объект управления данными можно сделать невидимым, установив его свойство Visible в False, так как для работы нам потребуется только созданный им набор записей.
Определите свойства меток, текстовых окон, списка и комбинированного окна следующим образом:
Label1.Caption=Имя
Label2.Caption=Фамилия
Label3.Caption=Идентификатор места работы
Label4.Caption=Обновление места работы
Text1.DataSource=Data1
Text1.DataField=Name
Text2.DataSource=Data1
Text2.DataField=LastName
Text3.DataSource=Data1
Text3.DataField= Id_work
DBList1.RowSource=Data2
DBList1.ListField=Office
DBList1.DataSource=Data1
DBList1.DataField=Id_work
DBList1.BoundColumn=ID_work
DBCombo1.RowSource=Data2
DBCombo1.ListField=Office
DBCombo1.DataSource=Data1
DBCombo1.DataField= Id_work
DBCombo1.BoundColumn=ID_work
Сохраните и запустите проект (рис.8.12). В связанных текстовых окнах на экранной форме будет отображаться содержимое полей Name, LastName и Id_work из таблицы PERSON. Список и комбинированное окно заполнятся названиями мест работы из таблицы WORKPLACE, причем место работы человека, определенного содержимым текстовых окон, будет выделено в списке подсветкой. Перемещением по набору записей с помощью первого объекта управления данными установите указатель на запись, где вы хотите обновить место работы. Из списка или комбинированного окна выберите требуемое значение и нажмите какую-либо кнопку на первом объекте управления данными, чтобы переместить указатель текущей записи и произвести обновление данных. Теперь верните указатель на ту же запись и убедитесь что информация о месте работы изменена в соответствие со сделанным выбором.
Рис.8.12. Результат работы приложения