Пример использования иерархических возможностей 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:\Temp\netar.mdb. Для настройки DNS можно создать и
*** сохранить пустой файл произвольного типа с именем "netar.mdb", т.к.
*** в дальнейшем программа его все равно удаляет и создает новый!
*** Кто знает, как настроить DNS программно, велкам!
*** Внимание! Важная особенность, описанная в одной из конференций.
*** Hierarchical FlexGrid как и TreeView работает с Twip'ами, поэтому
*** при расчете ширины ячеек нужно учитывать Twip'ы
*** и в качестве параметров для метода HitTest, при реализации
*** Drag&Drop нужно передавать координаты в Twip'ах.
*** Метод 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:\temp\netar.mdb" && ThisForm.MDBFullPath
IF FILE("&cMDB.")
delete file &cMDB.
ENDIF
oAcc.Visible = .F.
oAcc.NewCurrentDatabase(cMDB)
oMDB=oAcc.CurrentDB
* Для "иерархии" имеем 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
* Демонстрация использования иерархических рекордсетов
* Используется MSDataShape провайдер для создания иерархического
* рекордсета из таблиц Goods и Categs базы данных C:\temp\netar.mdb
WITH oConnection
.Provider="MSDataShape"
.OPEN("DSN=NETAR") && NETAR настроена на C:\temp\netar.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")
With ThisForm
* Начиняем Microsoft Hierarchical FlexGrid (для сравнения!):
* Можно реализовать более красивую начинку по желанию (поэлементо)
.MSHFlexGrid.DataSource = oRecordSet
.Width = 553
.Resize()
.Visible=.t.
EndWith
* Отмеченные недостатки MSHFlexGrid, по сравнению с True DB Grid:
* - отсутствие поддержки работы с прокруткой колесиком мыши;
* - отсутствие встроенного механизма поддержки печати;
* - если не "замораживать" левый столбец, то вызов вручную методов Expand
* и Collapse (щелчки на "+" и "-" в строках грида) доступен только в
* первом столбце грида и, как следствие, недоступен при прокрутке вправо.
* - Символы "+" и "-" для разворачивания "иерархии" маленького размера
* В остальном эти два грида практически идентичны. Выбор за вами...
Hi, кто Это смотрит...
Вот это Шмяга, так Шмяга...
Подскажи, автор, какой язык программирования использовать.
Home
19.04.06 20:14:11
Роман Васильевич - выложи рабочий пример
Кольцов Роман Васильевич
25.04.06 12:15:11
Используй язык программирования Visual FoxPro сборки 09.00.0000.3504 для Windows. На нем точно
будет работать, проверено!
Кольцов Роман Васильевич
25.04.06 12:15:34
Уважаемый ShmSoft! Я рекомендовал Вам это решение в качестве примера автоматизации Microsoft
Access. Из него, по крайней мере, четко видно как создавать БД Access (файл .mdb) и таблицы в этой
БД программным способом из под Visual FoxPro. Что Вам показалось здесь "шмягой" я не знаю?! Просто
удивлен! Если Вы действительно считаете себя программистом, то не грех поднапрячь свои
мыслительные способности и переделать пример под собственные нужды, а не ждать готовенького. Если
что-то не понятно, то пишите в личку, объясню как могу...
Кольцов Роман Васильевич
25.04.06 12:15:55
Новый, на этот раз рабочий пример поддержки иерархических возможностей MSHFlexGrid и True DB Grid,
извлеченный из моего реально работающего приложения специально опубликовал за следом, 21.04.06,
для любителей "готовых" решений. Надеюсь это поможет! ;-)
Вот ссылка: http://www.foxclub.ru/sol/index.php?act=view&id=535
An
09.06.07 14:09:59
А пример в FoxTalk за январь 1998 Дуга Хеннинга "Как нам углубиться в данные"? У меня журнал за
этот год без дискеты.
Кто знает где взять, откликнитесь!