Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать дерево каталогов 
:(
    Опции темы
Cashey
Дата 15.2.2006, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Довольно часто возникает необходимость создать так называемое "дерево каталогов", т.е. отображение условных каталогов как в проводнике 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



--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0378 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.