Сетка (MSFlexGrid) и улучшенное текстовое окно (RichTextBox)

1. MSFlexGrid.

2. RichTextBox.

MSFlexGrid

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