Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Как создать дерево каталогов

Поиск:
Довольно часто возникает необходимость создать так называемое "дерево каталогов", т.е. отображение условных каталогов как в проводнике Windows. Разумеется речь не идет только о каталогах файловой системы. Под термином "каталог" здесь подразумевается любое условное объединение данных. На пример, различные группы записей таблицы, относящиеся к разным разделам\подразделам.
В этой статье я объясню создание простого варианта такого "дерева каталогов".
И так, для создания отображения по средствам Visual FoxPro, необходимо:
1. Создать таблицу, содержащую поля, QUID, ParentQUID, Text, Lavel, в которых будут хранится соответсвенно - уникальный идентификатор текущей записи, уникальный идентификатор родительского каталога, текстовое название каталога или подкаталога и номер уровня вложенности.
2. Создать форму (или класс), на которую разместить с панели Form Controls, элемент ActiveX Control (OLEControl). В открывшемся окне Insert Object, выбрать элемент Microsoft TreeView Control, version 6 (или 5(SP2))
3. Создать на форме (или классе) следующие методы и свойства: openDBF(), NewKey(), addCatalog(), delCatalog(), addRecord(), getSelQUID(), getlevel(), showtree() и cnextkey. А также какой-нибудь метод, запускающий процесс заполнения дерева и добавления новых каталогов. В настоящем примере, я помещю код заполнения дерева в метод Init() формы, а добавление нового каталога, в специально созданный метод формы addCatalog().
4. Переименовать, для удобства, компонент Olecontrol1 в oleTree.
5. Заполнить свойство cnextkey значение "1_"
6. Заполнить соответсвующие методы кодом, аналогичным рассмотренному в этом примере

Метод oleTree.Init()
Код

LOCAL lcOldAlias, laFields, cKey, cParent

lcOldAlias = ALIAS()
lcDBFName = GETFILE('dbf')
IF EMPTY(m.lcDBFName)
RETURN
ENDIF
IF THISFORM.OpenDBF(lcDBFName)
*!* Здесь можно вызвать метод проверки корректности открытой таблицы.

* Заполняем TreeView control значениями из таблицы.
*----------------------------------------------------
oNode = this.Nodes
oNode.Clear

SCAN
cKey = ALLTRIM(Quid)
cParent = ALLTRIM(parentquid)
IF ALLTRIM(parentQuid) = '0_'
oNode.add(,1,ALLTRIM(Quid),ALLTRIM(text),0)
ELSE
oNode.add(ALLTRIM(parentQuid),4,ALLTRIM(Quid), ALLTRIM(text),0)
ENDIF
THISFORM.cNextKey = ALLTRIM(STR(VAL(Quid) + 1) + "_")
ENDSCAN
ENDIF


Метод Form.OpenDBF()
Код

LPARAMETERS lcDBFName, llExclusive
SET MULTILOCKS ON

lcAlias = SUBSTR(lcDBFName, RAT("\",lcDBFName) + 1)
lcAlias = SUBSTR(lcAlias, 1, AT(".", lcAlias) - 1)

IF llExclusive
USE (lcDBFName) IN 0 EXCLUSIVE
ENDIF

IF !USED(lcALIAS)
USE (lcDBFName) IN 0 SHARED
ENDIF

If CursorGetProp("Buffering", lcALIAS) # 5
CursorSetProp("Buffering", 5, lcALIAS)
ENDIF
thisform.alias = lcALIAS


Метод Form.AddCatalog()
Код

oNode = THISFORM.oleTree
Local oNewNode, cNewQUID, cNewName, cParentQUID, nLevel

cNewQUID = ""
cNewName = "Новый раздел"
cParentQUID = This.GetSelQUID()
nLevel = This.GetLevel(oNode.SelectedItem) + 1

* Добавляем новую запись в таблицу
If This.AddRecord(@cNewQUID, @cNewName, cParentQUID, nLevel)
* Если cNewRN не заполнен, то юзер просто отказался от создания
If !Empty(cNewQUID)
* Добавляем узел в коллекцию
oNewNode = oNode.Nodes.Add(oNode.SelectedItem.Key, 4, cNewQUID + '_', cNewName, 1, 2)

* Выделим и откроем новый каталог
oNewNode.Expanded = .T.
oNewNode.Selected = .T.
EndIf
ENDIF
this.showtree()


Метод Form.AddRecord()
Код

LParam cNewQUID, cText, cParentQUID, nLevel

Local cKeyField, lResult

lResult = .F.

If !FLock(this.alias)
Return lResult
EndIf

INSERT INTO (this.alias) (QUID, ParentQUID, Level, Text);
VALUES (this.newkey(), cParentQUID+"_", nLevel, cText)

lResult = TableUpdate(1, .T., this.alias)


UnLock In (this.alias)

Return lResult


Метод Form.NewKey()
Код

cKey = THIS.cNextKey
THIS.cNextKey = ALLTRIM(STR(VAL(THIS.cNextKey) + 1) + "_")
RETURN cKey


Метод Form.GetLevel()
Код

LParam oNode

If IsNull(This.OleTree.Nodes)
Return 0
EndIf

Return Occurs("\", oNode.FullPath)


Метод Form.getselquid()
Код

LParam oNode
Local cKey

If Param() = 0
cKey = THIS.oleTree.SelectedItem.Key
Else
cKey = oNode.Key
EndIf

Return Left(cKey, Len(cKey)-1)


Метод Form.showtree()
Код

oNode = this.oleTree.Nodes
oNode.Clear
SELECT (this.alias)
SCAN
IF ALLTRIM(parentQuid) = '0_'
oNode.add(,1,ALLTRIM(Quid),ALLTRIM(text),0)
ELSE
oNode.add(ALLTRIM(parentQuid),4,ALLTRIM(Quid), ALLTRIM(text),0)
ENDIF
THISFORM.cNextKey = ALLTRIM(STR(VAL(Quid) + 1) + "_")
ENDSCAN
Автор: Cashey






Просмотров: 12113

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную