Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Древовидный вывод данных из базы ? 
:(
    Опции темы
NAS
Дата 5.5.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 5.5.2007
Где: Ukrain/Ternopil/B am

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



smile  Привет всем!!! есть программа с базой данных нужно выводить данные в виде дерева 
(типа Explorer in Windows)

Помогите пожалуста smile 
PM MAIL WWW ICQ Skype GTalk Jabber YIM   Вверх
Klin
Дата 5.5.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Исчерпывающая информация smile Можно использовать компонент TreeView (из вкладки Win32).


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Anikmar
Дата 6.5.2007, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



Я это достаточно давно сделал, может быть по-топорному, но не стал ничего менять - работает устойчиво и ладно.
Делал так:
Код

//---------------------------------------------------------------------------
// Метод: BuildTree
// Построение дерева каталогов
// Список записей, поддерживающих метод GetMasterUni и GetNodeName находитя
// в списке pList      
// pTr - Дерево
bool TMAN_ADODBTree::BuildTree(TTreeView *pTr,TList * pList)
{
    int i,Master,cM;
    TMAN_ADOVrec *CurRec;
    TTreeNode *CurNode,*RootNode;
    TStack *pStack;
    AnsiString aN;

    // Стек нужен для временного хранения перебираемых узлов
    pStack = new TStack;
    CurRec = NULL;

    // Шаг 1 - очищаю дерево
    // и помечаю во всех записях списка узлы как неразмеченные
    pTr->Items->Clear();
    for (i=0;i<pList->Count;i++)
    {
        CurRec = (TMAN_ADOVrec*)pList->Items[i];
        CurRec->Node = NULL;
    }

    // Шаг 2 - Создаю корневой узел дерева
    RootNode = pTree->Items->AddChildObject(NULL,RootName,NULL);
    Master = 0; // Для начала - нужен мастер - корневой уровень
    CurNode = RootNode;
    if (MainImageIndex != -1) RootNode->StateIndex = MainImageIndex;

    // Шаг 3 - бегу по списку и добавляю в дерево узлы
    // Бегу пока в стеке есть записи
    //    while(pStack->Count()>0)
    do
    {
        for (i=0;i<pList->Count;i++)
        {
            CurRec = (TMAN_ADOVrec*)pList->Items[i];

            // Если запись уже есть в дереве - пропускаем
            if (CurRec->Node != NULL) continue;

            // Если мастер нас не устраивает - пропускаем
            cM = CurRec->GetMasterUni();
            if (cM != Master) continue;

            // Нашли запись для добавления
            // Запоминаем ее в стеке и помещаем в дерево
            aN = CurRec->GetNodeName();
            CurRec->Node =
                pTree->Items->AddChildObject(
                    CurNode,
                    aN,
                    CurRec);
            if (MainImageIndex != -1)
            {
                CurRec->Node->StateIndex = MainImageIndex;
                CurRec->Node->SelectedIndex = MainImageIndex;
                CurRec->Node->ImageIndex = MainImageIndex;
            }
            CurRec->FType = 1;      // Признак каталога
            // Запоминаем этот узел
            pStack->Push(CurRec);
        } // for (i=0;i<pList->Count;i++)
        // Все записи помещены в текущий уровень. Извлекаю из стека
        // последнюю записанную запись

        // Если стек пуст (ни одной записи не осталось) - выхожу
        if (pStack->Count() == 0) break;

        CurRec = (TMAN_ADOVrec*)pStack->Pop();
        CurNode = CurRec->Node;
        Master = CurRec->Uni;

    } while(true);

    pTree->Selected = RootNode;
    return true;
}



Пояснения к коду:
В pList у меня полный список записей из БД.  Записи БД загнаны в мой собственный класс, поэтому из кода нужно взять только алгоритм заполнения.

В списке pList объекты моего собственного класса, от них требуются следующие вещи:
Поле Node - предназначено для хранения узла дерева (изначально обнуляется)
Поле Uni содержит ключ текущей записи.
Метод GetNodeName Возвращает строку, которую отобразить в качестве названия узла
Метод GetMasterUni Возвращает ключ записи, к которой привязана текущая
Если подменить эти участки на собственные - то можно пользоваться, в общем то. Правда там еще пиктограммки ставятся, но это просто можно убрать.

Моя схема при зацикливании дерева просто обрезает зацикленные ветви. Я проверяю на зацикленность не при каждом построении дерева, а из служебной части - чтобы при зацикленном дереве сохранять более-менее работоспособность. Если после построения дерева останутся записи, в которых узел дерева нулевой - значит было зацикливание.

Это сообщение отредактировал(а) Anikmar - 6.5.2007, 12:21
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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