Пример использования иерархических возможностей MSHFlexGrid и True DB Grid

В приведенном примере продемонстрирована возможность использования в Microsoft Visual FoxPro иерархических возможностей ActiveX-контролов Microsoft Hierarchical FlexGrid и Component One True DB Grid
*** Пример использования в Microsoft Visual FoxPro иерархических возможностей
*** ActiveX Microsoft Hierarchical FlexGrid и Component One True DB Grid
*** (c) Кольцов Роман Васильевич aka rvc44, 2003
*** mailto: Roman.Koltsov gmail.com

*** В примере используется OLE-автоматизация Microsoft Access, поэтому
*** для успешной работы необходим не очеь старый Microsoft Access (лучше 2003)
*** Кто знает, как создать иерархический рекордсет без Access, велкам!

*** Перед использованием добавьте на вкладке User DNS в Пуск -> Настройка ->
*** ПанельУправления -> Администрирование -> Источники данных (ODBC)
*** новый источник данных с именем netar, драйвером Microsoft Access Driver (*.mdb)
*** и базой данных C:Tempnetar.mdb. Для настройки DNS можно создать и
*** сохранить пустой файл произвольного типа с именем "netar.mdb", т.к.
*** в дальнейшем программа его все равно удаляет и создает новый!
*** Кто знает, как настроить DNS программно, велкам!

*** Внимание! Важная особенность, описанная в одной из конференций.
*** Hierarchical FlexGrid как и TreeView работает с Twip'ами, поэтому
*** при расчете ширины ячеек нужно учитывать Twip'ы
*** и в качестве параметров для метода HitTest, при реализации
*** Drag&Drop нужно передавать координаты в Twip'ах.

#define cnLOG_PIXELS_X 88
#define cnLOG_PIXELS_Y 90
#define cnTWIPS_PER_INCH 1440
* 1440 твипов на дюйм
#define flexAlignLeftCenter 1
#define flexAlignCenterTop 3
#define flexAlignCenterCenter 4

*** Возможные значений параметра type в методе CreateField
#define dbBoolean 1 && Логический
#define dbByte 2 && Числовой (байт)
#define dbInteger 3 && Числовой (целое)
#define dbLong 4 && Числовой (длинное целое)
#define dbCurrency 5 && Денежный
#define dbSingle 6 && Числовой (одинароне с плавающей точкой)
#define dbDouble 7 && Числовой (двойное с плавающей точкой)
#define dbDate 8 && Дата/время
#define dbBinary 9
#define dbText 10 && Текстовый
#define dbLongBinary 11 && Поле объекта OLE
#define dbMemo 12 && Поле МЕМО
#define dbGUID 15 && Числовой (код репликации)
#define dbDecimal 20 && Числовое (действительное)

*** Возможные значений параметра в методе Quit
#define acQuitPrompt 0
#define acQuitSaveAll 1
#define acQuitSaveNone 2

*** Метод Init формы Visual FoxPro, на которой размещены ActiveX компоненты:
*** сверху True DB Grid и снизу MSHFlexGrid (для сравнения их возможностей)
LPARAM pUpForm * Вызывающая форма верхнего уровня
LOCAL sw As Long

This.UpForm=pUpForm

************* Создаем базу данных netar.mdb с двумя таблицами Goods и Categs ***********
* Непосредственно для создания таблиц используется метод CreateTableDef
* tabledef = database.CreateTableDef ([name], [attributes], [sourcetablename], [connect])
* Для создания полей таблицы используется объект Field и метод CreateField
* field = tabledef.CreateField ([name], [type], [size])
* После того, как таблица будет описана и в ней созданы необходимые поля,
* ее нужно будет добавить в базу данных. Для добавления таблицы в базу данных
* используется метод Append
* Для создания новой таблицы неоходимо определить новый объект TableDef
* (Table Definition - описание таблицы).
* Объект TableDef содержит всю необходимую информацию для определения таблицы БД.
*****************************************************************************************

oAcc=CREATEOBJECT("Access.Application")
WAIT WINDOW NOWAIT "Запуск Access..."
* Hide the instance of Microsoft Access.
* Microsoft Knowledge Base Article - 167659
sw = ShowWindow(oAcc.hWndAccessApp, 2)

* Созданим БД Access "Нетарифные меры регулирования ВЭД" для анализа ГТД
cMDB="C:tempnetar.mdb" && ThisForm.MDBFullPath
IF FILE("&cMDB.")
delete file &cMDB.
ENDIF
oAcc.Visible = .F.
oAcc.NewCurrentDatabase(cMDB)
oMDB=oAcc.CurrentDB

* Создадим таблицу Goods базы данных netar.mdb
oTbl=oMDB.CreateTableDef("Goods")
oTbl.Fields.Append(oTbl.CreateField("Direction", dbText, 5)) && .Append(oFld)
oTbl.Fields.Append(oTbl.CreateField("Sync", dbText, 30)) && Invisible
oTbl.Fields.Append(oTbl.CreateField("GTD", dbText, 23))
oTbl.Fields.Append(oTbl.CreateField("G022", dbText, 254))
oTbl.Fields.Append(oTbl.CreateField("G33", dbText, 10))
oTbl.Fields.Append(oTbl.CreateField("G31_1", dbText, 254))
oTbl.Fields.Append(oTbl.CreateField("G38", dbDouble))
oTbl.Fields.Append(oTbl.CreateField("G46", dbDouble))
oMDB.TableDefs.Append(oTbl)

* Создадим таблицу Categs базы данных netar.mdb
oTbl=oMDB.CreateTableDef("Categs")
oTbl.Fields.Append(oTbl.CreateField("G32", dbDouble))
oTbl.Fields.Append(oTbl.CreateField("G441", dbText, 4))
oTbl.Fields.Append(oTbl.CreateField("Sync", dbText, 30)) && Invisible
oTbl.Fields.Append(oTbl.CreateField("G442", dbText, 254))
oTbl.Fields.Append(oTbl.CreateField("G443", dbText, 254))
oMDB.TableDefs.Append(oTbl)

* Для "иерархии" имеем 2 курсора CurDclHead и CurDclCmpr.
* (их содержимое не привожу по соображениям госбезопасности 😉 )
* Перегоним их в 2 иерархических рекордсета
* Синхронизация между рекордсетами будет осуществляться по полю Sync
* Все поля в соответствующих курсорах и рекордсетах одноименные

* Конвертация "вручную" курсора1 в рекордсет1 с соответствующими полями
oRS=oMDB.OpenRecordSet("Goods")
SELECT CurDclCmpr && CurDclHead соответствующий курсор
SCAN
oRS.AddNew
FOR j = 0 TO oRS.Fields.Count-1
cFName=oRs.Fields(j).Name
vValue=EVALUATE(cFName)
oRs.Fields(j).Value=vValue
ENDFOR
oRS.Update
oRS.MoveFirst
ENDSCAN
oRS.Close

* Конвертация "вручную" курсора2 в рекордсет2 с соответствующими полями
oRS=oMDB.OpenRecordSet("Categs")
SELECT CurDclHead
SCAN
oRS.AddNew
FOR j = 0 TO oRS.Fields.Count-1
cFName=oRs.Fields(j).Name
vValue=EVALUATE(cFName)
oRs.Fields(j).Value=vValue
ENDFOR
oRS.Update
oRS.MoveFirst
ENDSCAN
oRS.Close
USE IN CurDclHead

oMDB.Close
oAcc.Quit(acQuitSaveAll)
RELEASE oAcc
WAIT CLEAR

* Демонстрация использования иерархических рекордсетов
* Используется MSDataShape провайдер для создания иерархического
* рекордсета из таблиц Goods и Categs базы данных C:tempnetar.mdb

oConnection = CREATEOBJECT("ADODB.Connection")
oRecordSet = CREATEOBJECT("ADODB.Recordset")

WITH oConnection
.Provider="MSDataShape"
.OPEN("DSN=NETAR") && NETAR настроена на C:tempnetar.mdb
ENDWITH

oRecordSet.ActiveConnection = oConnection
oRecordSet.OPEN ("SHAPE {SELECT * FROM Goods} AS Cmn2 " + ;
"APPEND ({SELECT * FROM Categs} AS Cmn2A RELATE " + ;
"Sync TO Sync) AS Cmn2A")

* Начиняем Component One True DB Grid:
With ThisForm.TDBGrid1
.DataSource = oRecordSet
.ExtendRightColumn = .T.
.ReBind
.Columns(0).Caption = "Тип ГТД"
.Columns(0).Width = 117 && 78
.Columns(1).Caption = "ГТД"
.Columns(1).Width = 215 && 143
.Columns(2).Visible = .F. && Номер товара
.Columns(3).Caption = "Код товара"
.Columns(3).Width = 100 && 68
.Columns(4).Caption = "Вес нетто"
.Columns(4).Width = 95 && 63
.Columns(5).Caption = "Статистич. стоимость"
.Columns(5).Width = 110 && 78
.Columns(6).Caption = "Наименование товара"
.Columns(7).Caption = "Отправитель / Получатель"
.Columns(8).Visible = .F. && ГТД
.Columns(9).Caption = "№ товара в ГТД"
.Columns(10).Caption = "Код документа"
.Columns(11).Caption = "№ документа"
.Columns(12).Caption = "Дата выдачи документа"
EndWith

With ThisForm
* Начиняем Microsoft Hierarchical FlexGrid (для сравнения!):
* Можно реализовать более красивую начинку по желанию (поэлементо)
.MSHFlexGrid.DataSource = oRecordSet

.Width = 553
.Resize()
.Visible=.t.
EndWith

* Отмеченные недостатки MSHFlexGrid, по сравнению с True DB Grid:
* - отсутствие поддержки работы с прокруткой колесиком мыши;
* - отсутствие встроенного механизма поддержки печати;
* - если не "замораживать" левый столбец, то вызов вручную методов Expand
* и Collapse (щелчки на "+" и "-" в строках грида) доступен только в
* первом столбце грида и, как следствие, недоступен при прокрутке вправо.
* - Символы "+" и "-" для разворачивания "иерархии" маленького размера
* В остальном эти два грида практически идентичны. Выбор за вами...

Автор: Кольцов Роман Васильевич

Автор публикации

не в сети 16 лет

rvc44

0
Комментарии: 0Публикации: 7Регистрация: 06-12-2005
0
Вложенные файлы
#
Тип файла
Размер
Название
1 .zip 3,57 КБ 531solution533
Оставить комментарий
Авторизация
*
*
Генерация пароля