List box и 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:WORKPRODUCTS.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 (OLE container)

Применение объекта 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:WORKDB.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. Результат работы приложения