Сетка (MSFlexGrid) и улучшенное текстовое окно (RichTextBox)
ActiveX объект MSFlexGrid может применяться для отображения на экранной форме данных, представленных в табличном виде. Если сетка MSFlexGrid связана с базой данных, то данные используются в режиме только для чтения. Это значит, что вы можете проводить операции над содержимым ячеек таблицы, например, сложение, умножение, сравнение, слияние строк, вывод результатов в ячейки, но не можете обновить данные в базе данных. Для установки связи сетки MSFlexGrid с данными используется свойство DataSource, которое определяется как имя соответствующего объекта управления данными.
Чтобы добавить объект MSFlexGrid на панель инструментов, выполните команду меню Project -> Components и выберите из списка элементов управления (Controls) Microsoft FlexGrid Control и затем нажмите кнопку OK. После этого на панели инструментов появится новая пиктограмма - .
Свойства Row и Col объекта MSFlexGrid определяют положение текущей ячейки. Содержимое текущей ячейки доступно через свойство Text, то есть данные в таблице хранятся в текстовом виде. Этот факт не доставляет много хлопот, так как в Visual Basic есть функции преобразования строки в число и обратно. Если в ячейку требуется занести число, то необходимо использовать функцию преобразования числа в строку CStr, например:
MSFlexGrid1.Text=CStr(sum).
С другой стороны, при извлечении числа из текстового содержимого ячейки можно использовать функцию Val, например:
sum=sum+Val(MSFlexGrid1.Text)
Свойства Rows и Cols позволяют определить количество строк и столбцов в сетке. Наличие заголовков у строк и столбцов можно установить с помощью свойств FixedRows и FixedCols. Содержимое заголовков определяется свойством FormatString. Например, следующей пример показывает, как установить заголовки столбцов сетки:
s$ = "<Код товара |<Дата зак. |<Код покуп. |>Кол-во |<Наименов.товара |<Цена "
MSFlexGrid1.FormatString = s$
Заголовки строк сетки определяются аналогичным образом, только в начало строки необходимо поместить символ “точка с запятой”, который укажет сетке, что это именно заголовки строк:
s$ = ";Имя|Адрес|Телефон" MSFlexGrid1.FormatString = s$
Получить или установить содержимое произвольной ячейки позволяет свойство TextArray. Это свойство имеет синтаксис:
MSFlexGrid1.TextArray( cellindex ) [= string ]
где string - текстовое содержимое ячейки, определенной аргументом cellindex. Аргумент cellindex представляет собой индекс ячейки в сетке и рассчитывается следующим образом. К номеру колонки произвольной ячейки прибавляется произведение ее номера строки на общее количество колонок в сетке, определенное свойством Cols. Для расчета аргумента cellindex удобно использовать следующую функцию:
Function GetCellIndex(row As Integer, col As Integer) As Long GetCellIndex = row*MSFlexGrid1.Cols + col End Function
При операциях со строками и колонками объекта MSFlexGrid следует помнить, что отсчет строк и колонок ведется не с единицы, а с нуля. Таким образом, первая строка сетки, в которой обычно находятся заголовки, на самом деле является нулевой строкой.
Для демонстрации использования объекта MSFlexGrid создадим приложение, предназначенное для просмотра полей базы данных, содержащей информацию о покупателях, сделанных ими заказах и товарах.
База данных CASTOMER.MDB включает в себя три таблицы:
CASTOMER - содержит информацию о покупателях,
ORDERSALES - содержит информацию о сделанных ими заказах,
PRODUCTS - содержит информацией о товарах.
Структуры таблиц базы данных показаны в следующих таблицах.
Таблица. Структура таблицы CASTOMER
Поле |
Описание |
Id_cust | Код покупателя |
Name | Имя |
LastName | Фамилия |
Concern | Предприятие |
Address | Адрес |
Phone | Телефон |
Note | Примечание |
Таблица. Структура таблицы ORDERSALES
Поле |
Описание |
Id_prod | Код товара |
Date_order | Дата заказа |
id_cust | Код покупателя |
num_order | Количество заказанного товара |
Date_sale | Дата продажи |
num_sale | Количество проданного товара |
Note | Примечание |
Таблица. Структура таблицы PRODUCTS
Поле |
Описание |
Id_prod | Код товара |
Product | Наименование товара |
Price | Цена за единицу товара |
Repository | Наличие товара на складе |
Note | Примечание |
Связь между таблицами осуществляется на основании значений совпадающих полей id_cust и Id_prod.
Создайте новый проект и расположите на форме два объекта управления данными, пять меток, четыре текстовых окна, командную кнопку и объект управления MSFlexGrid. Размещение объектов показано на рис.9.1.
Рис.9.1. Расположение элементов управления на экранной форме
В окне свойств первого объекта управления данными установите свойство DataBaseName как имя базы данных CASTOMER.MDB. Затем определите свойство RecordSource этого объекта как CASTOMER. У второго объекта Data установите свойство DataBaseName аналогичным образом, а его свойство RecordSource определим позднее в коде программы и оно будет устанавливаться должным образом во время выполнения приложения. Этот объект можно сделать невидимым, установив его свойство Visible в False.
Определите свойства меток, текстовых окон и объекта MSFlexGrid следующим образом:
Label1.Caption=Имя Label2.Caption=Фамилия Label3.Caption=Предприятие Label4.Caption=Код покупателя Label5.Caption=Заказы Text1.DataSource=Data1 Text1.DataField=Name Text2.DataSource=Data1 Text2.DataField=LastName Text3.DataSource=Data1 Text3.DataField=Concern Text4.DataSource=Data1 Text4.DataField=Id_Cust DataSource=Data2 FixedCols=0 FixedRows=1 Cols=2 Rows=2
Теперь установите свойство Caption командной кнопки как “Просмотр заказов” и добавьте в процедуру обработки нажатия кнопки следующий код:
Private Sub Command1_Click() ' Определим источник данных для объекта Data2 Dim str As String str = "SELECT ORDERSALES.Id_prod, PRODUCT.product, PRODUCT.price, ORDERSALES.num_order, ORDERSALES.Date_order, ORDERSALES.Id_cust, ORDERSALES.Date_sale, ORDERSALES.num_sale FROM ORDERSALES, PRODUCT WHERE ordersales.Id_cust=" + Text4.Text + "AND ordersales.id_prod = product.id_prod" Data2.RecordSource = str Data2.Refresh ' Установим заголовки столбцов у объекта MSFlexGrid s$ = "<Код товара |<Наименов.товара |<Цена |<Кол-во |<Дата заказа |<Код покуп. |<Дата продажи |<Кол-во прод. " MSFlexGrid1.FormatString = s$ MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1 MSFlexGrid1.row = MSFlexGrid1.Rows - 1 MSFlexGrid1.col = 0 MSFlexGrid1.Text = "Всего:" MSFlexGrid1.col = 1 ' Расчет суммы заказа Dim i As Integer Dim sum As Double sum = 0 For i = MSFlexGrid1.FixedRows To MSFlexGrid1.Rows - 1 sum = sum + Val(MSFlexGrid1.TextArray(GetCellIndex(i, 2))) * Val(MSFlexGrid1.TextArray(GetCellIndex(i, 3))) Next MSFlexGrid1.Text = CStr(sum) + " руб." MSFlexGrid1.row = 1 MSFlexGrid1.col = 1 End Sub Function GetCellIndex(row As Integer, col As Integer) As Long GetCellIndex = row * MSFlexGrid1.Cols + col End Function
Сохраните и запустите проект. Результат работы приложения показан на рис.9.2.
Рис.9.2. Результат работы приложения
Улучшенное текстовое окно (RichTextBox)
Возможностей обычного текстового окна в большинстве случаев достаточно для отображения текстовой информации из базы данных. Однако, у него есть один недостаток - текстовое окно не допускает форматирования текста. Если необходимо хранить в базе данных текст с элементами форматирования, вы можете использовать улучшенное текстовое окно (RichTextBox). Этот объект управления позволяет работать со шрифтами, изменять атрибуты у выделенного фрагменты текста (полужирный, курсив, подчеркнутый или перечеркнутый), осуществлять различные виды выравнивание текста (по левому краю окна, по правому краю окна или по центру), устанавливать отступы и выступы у абзацев и др.
Все эти функции реализованы посредством поддержки этим объектом управления формата RTF (Rich Text Format - расширенный текстовый формат). Объект RichTextBox транслирует текст в формате RTF и выполняет форматирование и отображение текста на экранной форме.
С базой данных RichTextBox связывается установкой свойств DataSource и DataField. Тип поля в базе данных формата MS Access, с которым связывается объект RichTextBox, должен быть Binary или Memo. Если используется другой формат, то поле должно быть большой емкости (например, типа Text у базы данных Microsoft SQL Server).
По умолчанию RichTextBox недоступен на панели инструментов Visual Basic. Добавить его в проект можно выполнив команду меню Project->Components и отметив контрольный индикатор Microsoft Rich TexBox Control в окне объектов управления (Controls). После этого но панели инструментов появится его пиктограмма .
Создадим с помощью приложения VisData базу данных RICH.MDB, единственная таблица TEXTS которой содержит два поля Id (типа Integer) и Text1 (типа Memo).
В демонстрационном приложении предусмотрим возможность форматирование текста изменением следующих нескольких свойств объекта RichTextBox: SelBold, SelItalic, SelUnderline и SelStrikeThru. Возможные установки этих свойств приведены в таблице.
Таблица. Некоторые свойства улучшенного текстового окна.
Свойство |
Описание |
SelBold | Если установлено True, то выделенный текст отображается полужирным стилем. |
SelItalic | Если установлено True, то выделенный текст отображается курсивом. |
SelUnderline | Если установлено True, то выделенный текст подчеркивается. |
SelStrikeThru | Если установлено True, то выделенный текст перечеркивается. |
Создайте новый проект и расположите на экранной форме объект управления данными, текстовое окно, улучшенное текстовое окно и пять командных кнопок, как показано на рис.9.3. Обычное текстовое окно позволит увидеть, что представляет собой текст в формате RTF.
Рис.9.3. Расположение элементов управления на экранной форме
Определите свойства объекта управления данными DataBaseName и RecordSource как “C:\WORK\RICH.MDB” и “Texts”, соответственно. Свойства остальных объектов, расположенных на форме установите следующим образом:
Command1.Caption=Полужирный Command2.Caption=Курсив Command3.Caption=Подчеркнутый Command4.Caption=Перечеркнутый Command5.Caption=Добавить Text1.DataSource=Data1 Text1.DataField=Text1 RichTextBox1.DataSource=Data1 RichTextBox1.DataField=Text1
В процедуры обработки событий нажатия командных кнопок добавьте следующий код:
Private Sub Command1_Click() If RichTextBox1.SelBold = Fulse Then RichTextBox1.SelBold = True Else RichTextBox1.SelBold = Fulse End If End Sub Private Sub Command2_Click() If RichTextBox1.SelItalic = Fulse Then RichTextBox1.SelItalic = True Else RichTextBox1.SelItalic = Fulse End If End Sub Private Sub Command3_Click() If RichTextBox1.SelUnderline = Fulse Then RichTextBox1.SelUnderline = True Else RichTextBox1.SelUnderline = Fulse End If End Sub Private Sub Command4_Click() If RichTextBox1.SelStrikeThru = Fulse Then RichTextBox1.SelStrikeThru = True Else RichTextBox1.SelStrikeThru = Fulse End If End Sub Private Sub Command5_Click() Data1.Recordset.AddNew End Sub
Сохраните и запустите проект. Добавьте произвольную текстовую строку в базу данных и проведите операции форматирования выделяемых участков текста с помощью командных кнопок.
Результат работы этого приложения показан на рис.9.4. Обратите внимание на то, как в обычном текстовом окне отображается содержимое объекта RichTexBox.
Рис.9.4. Результат работы приложения