- •1. Специальные конструкции языка 6
- •Введение
- •Специальные конструкции языка
- •Пользовательские типы данных
- •Типизированные файлы
- •Текстовые файлы
- •Нетипизированные файлы
- •Обработка ошибок
- •Оператор On Error
- •Объект Err
- •Обработка событий мыши и клавиатуры
- •Обработка событий мыши
- •Обработка событий клавиатуры
- •1.5. Элемент управления MaskedEdit
- •Графика
- •Элементы управления для графических изображений
- •Генерация графических изображений (примитивов)
- •Графические методы
- •Координаты элементов управления.
- •Примеры использования графических методов
- •Задания для самостоятельной работы
- •Работа с таймером
- •Анимация графических изображений
- •Основные свойства и методы
- •Примеры создания эффектов анимации
- •Варианты заданий по анимации для самостоятельной работы
- •Стандартные диалоговые окна
- •Работа с базами данных в vb
- •Элемент управления Data
- •Объект Recordset
- •Элемент управления msFlexGrid
- •Элемент управления ms Data Bound Grid
- •Использование языка sql в vb для работы с базами данных
- •Литература
Элемент управления msFlexGrid
Для отображения (и только для отображения, редактирование невозможно) информации из присоединяемой на этапе выполнения базы данных удобно использовать элемент управления MSFlexGrid (Сетка). Сетка является двумерной таблицей, позволяющей эквивалентно отображать таблицы реляционных баз данных. Рассмотрим свойства сетки, необходимые для отображения таблиц базы данных:
Cols (Колонки) - число колонок в сетке.
Rows (Строки) - число строк в сетке.
GridLines - изображение линий сетки (True - линии сетки изображаются, False - нет).
GridLinesWidth - ширина сетки таблицы.
Col, Row определяет или устанавливает активную ячейку (номера колонки и строки соответственно). Синтаксис: имя_сетки.Col [= номер], имя_сетки.Row [= номер]. Доступны только на этапе выполнения.
HighLight определяет подсветку выделенной ячейки сетки (True - подсветка есть, False - нет).
FixedCols (Фиксированные колонки) - количество фиксированных колонок (отсчет от левого края) для отображения заголовков таблицы. Эти колонки нельзя прокручивать и они выделяются серым фоном.
FixedRows (Фиксированные строки) - количество фиксированных строк (отсчет сверху вниз) для отображения заголовков. Эти строки нельзя прокручивать и они выделяются серым фоном.
ScrolBars (Линейки прокрутки) - горизонтальная и вертикальная линейки прокрутки для отображения невидимых колонок и строк (ScrolBars = 0 - нет линеек прокрутки, 1 - горизонтальная линейка прокрутки, 2 - вертикальная линейка прокрутки, 3 - обе линейки прокрутки).
ColWidth (Ширина колонки), RowHeight (Высота строки) - ширина колонки и высота строки. Измеряются в twips (1/20 пункта).
Text - содержимое текущей ячейки.
TabStop - возможность использования клавиши табуляции для движения по ячейкам сетки (True - возможно, False - невозможно).
DataSourse – источник данных (имя элемента Data).
Методы AddItems и RemoveItem позволяют соответственно добавить или удалить заданную строку сетки.
Для задания свойств сетки можно использовать специальные диалоговые окна (щелчок мыши по полю Custom в списке свойств, рис. 7.5). Окно позволяет задать основные свойства сетки (General), а также фонты (Fonts) и цветовую палитру (Color).
Пример 7.3. Рассмотрим пример приложения, которое открывает существующую на компьютере базу данных, выдает список таблиц базы данных и выводит выбранную пользователем таблицу в сеточную форму. Будем использовать уже рассмотренную выше базу данных по поставщикам и товарам на складе (рис. 7.1). Используются элементы управления: Data (имя – Data1), MSFlexGrid (имя – Grid1), командная кнопка (имя – ConnectBtn), комбинированный список (имя – Combo1) и Common Dialog (имя – CommonDialog1). Форма на этапе разработки имеет вид, показанный на рис. 7.6.
Рис. 7.5. Диалоговое окно для задания свойств сетки
Рис. 7.6. Общий вид интерфейса
Алгоритм работы приложения следующий. При щелчке мыши по командной кнопке «Подключить», появляется стандартное диалоговое окно для выбора файла базы данных.
После выбора файла базы данных программно формируется список таблиц выбранной базы данных, который выводится в комбинированное окно.
После выбора элемента списка (таблица базы данных) содержимое таблицы выводится на сетку. Линейки прокрутки сетки позволяют просматривать все поля таблицы или запроса.
Текст процедур обработки событий программы, приведен ниже.
Option Explicit
Private Sub Combo1_Click()
'Выбор таблицы из списка и заполнение сетки её данными
FillGridTable Combo1.Text
End Sub
Private Sub ConnectBtn_Click()
'запуск диалога "Открыть файл", по кнопке «Подключить»
Const vbOFNPATHMUSTEXIST = &H800&
Const vbOFNFILEMUSTEXIST = &H1000&
Combo1.Clear
CommonDialog1.DefaultExt = "MDB"
CommonDialog1.FileName = ""
CommonDialog1.Filter = "Базы данных _
MS Access(*.MDB)|*.MDB"
CommonDialog1.Flags = vbOFNPATHMUSTEXIST
CommonDialog1.Action = 1
If CommonDialog1.FileName = "" Then Exit Sub
OpenDataBase CommonDialog1.FileName
End Sub
Public Sub OpenDataBase(ByVal DataFile As String)
'Открытие базы данных и заполнение Combo1 списком таблиц
Dim I As Integer
Data1.Connect = "Access"
Data1.DatabaseName = DataFile ‘имя БД
Data1.RecordSource=””
Data1.Refresh
Combo1.Clear
For I = 1 To Data1.Database.TableDefs.Count - 1
Combo1.AddItem Data1.Database.TableDefs(I).Name
Next
Combo1.Text = ""
End Sub
Private Sub FillGridTable(ByVal QueryString As String)
'заполнение MSFlexGrid1 данными из таблицы
Dim I As Integer, CellWidth As Integer
Data1.RecordSource = QueryString ‘имя таблицы
MSFlexGrid1.Cols = _
Data1.Database(QueryString).Fields.Count
MSFlexGrid1.Row = 0
For I = 0 To Data1.Database(QueryString) _
.Fields.Count - 1
MSFlexGrid1.Col = I
MSFlexGrid1.Text = _
Data1.Database(QueryString).Fields(I).Name
MSFlexGrid1.ColWidth(I) = _
TextWidth(MSFlexGrid1.Text) + 100
Next
Data1.Refresh
If Not Data1.Recordset.EOF Then _
Data1.Recordset.MoveLast
MSFlexGrid1.Rows = Data1.Recordset.RecordCount + 1
If Not Data1.Recordset. BOF Then _
Data1.Recordset.MoveFirst
MSFlexGrid1.Row = 0
Do While Not Data1.Recordset.EOF
MSFlexGrid1.Row = MSFlexGrid1.Row + 1
For I = 0 To Data1.Database(QueryString) _
Fields.Count - 1
MSFlexGrid1.Col = I
If IsNull(Data1.Recordset.Fields(I).Value) Then _
MSFlexGrid1.Text = ""
Else: MSFlexGrid1.Text = _
Data1.Recordset.Fields(I).Value
End If
CellWidth = TextWidth(MSFlexGrid1.Text) + 100
If CellWidth > MSFlexGrid1.ColWidth(I) Then _
MSFlexGrid1.ColWidth(I) = CellWidth
Next I
Data1.Recordset.MoveNext
Loop
End Sub
Процедура ConnectBtn_Click обеспечивает очистку комбинированного списка и обращение к стандартному окну «Открыть файл» с заданным расширением (*.mdb) (рис. 7.7). После выбора файла происходит обращение к процедуре OpenDataBase, в которую передается имя выбранного файла (CommonDialog1.FileName).
Процедура OpenDataBase обеспечивает подключение к базе данных через элемент управления Data (по умолчанию оператором Data1.Connect = " " выбирается формат MS Access) и заполнение комбинированного списка именами таблиц (цикл). Имя базы данных определяется в свойстве Data1.DatabaseName с помощью передаваемого в процедуру параметра DataFile. Из списка можно выбрать нужную таблицу, содержимое которой выводится в сеточную форму (рис. 7.8).
Рис. 7.7. Окно открытия файла
Рис. 7.8. Отображение базы данных в элементе MSFlexGrid
После выбора таблицы, процедура обработки события Combo1_Click вызывает процедуру FillGridTable заполнения сетки, в которую через параметр передается имя выбранной таблицы Combo1.Text.
В процедуре FillGridTable инициализируется множество записей таблицы (оператор Data1.RecordSource = QueryString), определяется количество колонок таблицы (оператор MsFlexGrid1.Cols = Data1.Database(QueryString).Fields.Count); первая строка сетки (MsFlexGrid1.Row = 0) заполняется названиями колонок выбранной таблицы следующим образом:
For I = 0 To Data1.Database(QueryString).Fields.Count-1
MsFlexGrid1.Col = I
MsFlexGrid1.Text = _
Data1.Database(QueryString).Fields(I).Name
MsFlexGrid1.ColWidth(I) = TextWidth(Grid1.Text) + 100
Next I
В этих операторах для задания ширины каждой колонки используется обращение к функции TextWidth, которая возвращает длину выводимого текста.
Количество записей и соответственно количество строк сетки определяется операторами
Data1.Refresh
MsFlexGrid1.Rows = Data1.Recordset.RecordCount + 1
Цикл Do-Loop обеспечивает движение по записям (оператор Data1.Recordset.MoveNext) до тех пор, пока функция EOF имеет значение False (т.е. до последней записи). На каждом шаге цикла производится переход к новой строке (MsFlexGrid1.Row = MsFlexGrid1.Row + 1), для которой выполняется цикл (MsFlexGrid1.Col = I) заполнения всех ее ячеек.
Если поле таблицы базы данных не содержит значения (проверяется функцией IsNull(Data1.Recordset.Fields(I).Value)), то соответствующая ячейка сетки заполняется пустой строкой.
Последние операторы обеспечивают согласование ширины ячеек таблицы с максимально возможной длиной поля записи.
CellWidth = TextWidth(MsFlexGrid1.Text) + 100
If CellWidth > MsFlexGrid1.ColWidth(I) Then
MsFlexGrid1.ColWidth(I) = CellWidth.
Заполненная сетка показана на рис. 7.8.