Поиск:

Ответ в темуСоздание новой темы Создание опроса
> каталоги в TreeView, замучился делать, но все без результатов 
V
    Опции темы
Domain
  Дата 6.4.2010, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет. Делаю диплом и мне просто необходимо реализовать там следующие... Например я при помощи TDirectoryEdit выбираю каталог и получаю его имя. Потом мне нужно в TreeView отобразить все папки и подкаталоги, примерно таким образом:

Dir1
     -dir1.1
     -dir1.2
     -dir1.3
              --dir1.3.1
              --dir1.3.2
              --dir1.3.3
Dir2
     -dir2.1
     -dir2.2
     -dir2.3
              --dir2.3.1
              --dir2.3.2
              --dir2.3.3
где dir1.3.2 имеет следующий путь C:\Dir1\dir1.3\dir1.3.2

Т.е. основные директории лежат в основе дерева, подкаталоги второй уровень(т.е. узел) и т.д.

Функция для поиска папок и подкаталогов(причем всех) следующая:
Код

TStringList * __fastcall TfNewbk::GetSubDirs(AnsiString RootDir) 
{
 TStringList *Result = NULL;

 if (DirectoryExists(RootDir))
 {
   TSearchRec sr;
   AnsiString  MaskNameString;

   Result = new TStringList();
   Result->Clear();
   Result->Append(RootDir);

   for (int i = 0; i < Result->Count; i++)
   {
     MaskNameString = Result->Strings[i] + "\\*.*";
     for (int j = 0;;j++)
     {
       if (!j)
       {
         if (FindFirst(MaskNameString, faAnyFile, sr))
         {
           FindClose(sr);
           break;
         }
       }
       else
       {
         if (FindNext(sr))
         {
           FindClose(sr);
           break;
         }
       }
       if(sr.Attr&faDirectory)
       {
         if((sr.Name != ".") && (sr.Name != ".."))
         {
           Result->Append(Result->Strings[i] + "\\"+ sr.Name);
         }
       }
     }  
   }
   Result->Delete(0);
 }

 
 return Result;
}



но как все эти папки и подкаталоги потом раскидать по TreeView ума не приложу. Подскажите как быть? Может например искать подкаталоги и кидать их в TreeView, а потом искать в них подкаталоги, при этом создавая узлы. Кто знает помогите, оч нужно... 
PM MAIL   Вверх
Domain
Дата 13.4.2010, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



хей багуп
PM MAIL   Вверх
ИванМ
Дата 13.4.2010, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 5
Всего: 23



Можно просто через FindFirst/FindNext искать все каталоги/файлы и в зависимости от этого создавать нужный узел. Оформить это в виде функции. И если это каталог, то вызывать эту функцию снова, рекурсивно, с новым значением маски.
PM MAIL   Вверх
Domain
Дата 15.4.2010, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а дай функцию для поиска подкаталогов первого уровня... 
PM MAIL   Вверх
SenkraD
Дата 15.4.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 23



Domain,  найди книгу Архангельского "C++ Builder
и Механизмы Windows" - там он писал приммеры файловых менеджеров
и обсуждались аспекты посторения деревьев по файловой системме



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Domain
Дата 15.4.2010, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ну нормально. спс.
PM MAIL   Вверх
Domain
Дата 18.4.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а как функцию переписать чтобы она мне подкаталоги только первого уровня показывала, а не всех?
PM MAIL   Вверх
SenkraD
Дата 19.4.2010, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 23



Если идти по итнуиции, то сделать bool параметр для указания того,
что фун-ка работает рекурсивно или нет. и если нужен только первый уровень,
то передаём false.
А вообще, Domain,  какую функцию? Где код?



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Domain
Дата 19.4.2010, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



вот функция для поиска всех подкаталогов всех уровней

Код

TStringList * __fastcall TfNewbk::GetSubDirs(AnsiString RootDir) 
{
 TStringList *Result = NULL;
 if (DirectoryExists(RootDir))
 {
   TSearchRec sr;
   AnsiString  MaskNameString;
   Result = new TStringList();
   Result->Clear();
   Result->Append(RootDir);
   for (int i = 0; i < Result->Count; i++)
   {
     MaskNameString = Result->Strings[i] + "\\*.*";
     for (int j = 0;;j++)
     {
       if (!j)
       {
         if (FindFirst(MaskNameString, faAnyFile, sr))
         {
           FindClose(sr);
           break;
         }
       }
       else
       {
         if (FindNext(sr))
         {
           FindClose(sr);
           break;
         }
       }
       if(sr.Attr&faDirectory)
       {
         if((sr.Name != ".") && (sr.Name != ".."))
         {
           Result->Append(Result->Strings[i] + "\\"+ sr.Name);
         }
       }
     }  
   }
   Result->Delete(0);
 }
 
 return Result;
}

PM MAIL   Вверх
Domain
Дата 22.4.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



SenkraD братушечка выручай ... еее ..
PM MAIL   Вверх
DCamer
Дата 22.4.2010, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Domain, этот "Файловый менеджер" будет работать с папками на компьютере?
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
SenkraD
Дата 22.4.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 23



Domain,  builder'а под рукой нет - так, что получи почти кросплатформенный вариант
Код
//--------------------------------------------------------------------------------------------------
#include <io.h>

#include <string>
#include <vector>
#include <iostream>


//--------------------------------------------------------------------------------------------------
std::size_t getSubfolderList(std::string const& path, std::vector<std::string>& items)
{
    struct _finddata_t fileInfo = { 0 };
    intptr_t fileHandle = _findfirst((path + "/*.*").c_str(), &fileInfo);
    if (fileHandle != -1L)
    {
        do
        {
            std::string const itemName = fileInfo.name;
            bool isDirectory = (fileInfo.attrib & _A_SUBDIR);
            bool isDotFolder = isDirectory && ((itemName == ".") || (itemName == ".."));
            if (isDirectory && !isDotFolder)
            {
                items.push_back(itemName);
            }
        } while (_findnext(fileHandle, &fileInfo) == 0);
        _findclose(fileHandle);
    }
    return items.size();
}
//--------------------------------------------------------------------------------------------------
// Application entry point
//
int main(int argc, char const* const argv[])
{
    std::vector<std::string> items;
    std::string const folder = "C:/";
    if (getSubfolderList(folder, items) > 0)
    {
        std::cout << "Folder (" << folder << ") subfolders list:\n";
        for (std::vector<std::string>::const_iterator it = items.begin(), last = items.end(); it != last; ++it)
        {
            std::cout << "\t" << *it << "\n";
        }
        std::cout.flush();
    }
    return 0;
}

//--------------------------------------------------------------------------------------------------
P.S. Неужели 



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
DCamer
Дата 22.4.2010, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Domain, чтобы отобразить путь в лейбле нужно на форму кинуть лейбл и в свойствах TDirectoryListBox указать имя лейбла в DirLabel

Это сообщение отредактировал(а) DCamer - 22.4.2010, 12:51
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
xvr
Дата 23.4.2010, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



При создании TTreeView заполняешь ему один уровень именами каталогов. В каждом каталоге делаешь 1 вложенный item c текстом типа '<Loading...>'. На раскрытие item'ов вешаешь событие, которое сканирует соотвествующий подкаталог (на 1 уровень, без рекурсий) и по окончании заменяет узел '<Loading...>' на построенный список. Построенный уровень так же должен содержать '<Loading...>' для всех вложенных каталогов


PM MAIL   Вверх
Domain
Дата 23.4.2010, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ну сам принцип я давно догнал, тока что не мог убрать рекурсию из той функции, которую я написал уже дважды тут. просто она нормально работает, только так  не понял где там рекурсию убрать. xvr может ты мне подскажешь? в том что SenkraD написал я еще не разбирался. имхо у меня еще пока не такой уровень, чтобы потом этот код грамотно в bcb поместить. может тогда скажете в каком месте я получаю путь к каталогу, чтобы потом его например в StringList добавить?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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