Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > папки и подкаталоги в TreeView


Автор: Domain 1.4.2010, 23:51
Всем привет. Нужно в  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

и т.д. Подскажите пожалуйста как это можно реализовать.

Добавлено через 3 минуты и 28 секунд
И по нажатию на определенную папку получать ее путь. например если кликаем на --dir1.3.2 то получаем примерно C:\Dir1\dir1.3\dir1.3.2
            

Автор: DCamer 2.4.2010, 00:14
Цитата(Domain @  2.4.2010,  00:51 Найти цитируемый пост)
И по нажатию на определенную папку получать ее путь.

И где путь отображаться должен?

Автор: Domain 2.4.2010, 08:19
да не важно. например в edit или еще гденить. И еще такой вопрос, можно ли как нибудь в TreeView напротив каждого каталога сделать что-то типа checkbox?

Автор: Domain 2.4.2010, 10:55
Ну может кто подскажет кто как мне вывести подкаталоги в заданной папке....

Автор: xvr 2.4.2010, 11:24
Цитата(Domain @  2.4.2010,  10:55 Найти цитируемый пост)
Ну может кто подскажет кто как мне вывести подкаталоги в заданной папке.... 
Отсканировать папку и добавить все, что найдется к списку. См. FindFirst и FindNext из SysUtils


Автор: Domain 2.4.2010, 11:38
 smile  иБОЯ пробовал но ничего не вышло.
Код

TStringList * __fastcall TForm1::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);
 }


Выводит сначала все нормально, а потом еще и лажу всякую. вот как то так:

D:\Film\fun
D:\Film\metal
D:\Film\ot
D:\Film\system
D:\Film\avatar 2
D:\Film\funfun
D:\Film\metalmetal
D:\Film\otot
D:\Film\systemsystem
D:\Film\avatar 2avatar 2

то есть подкаталоги один раз нормально а потом повторяет имена папок  smile . Как быть? Выручайте))))   

Автор: xvr 2.4.2010, 13:31
Строка 17 должна быть
Код

MaskNameString = Result->Strings[i] + "\\*.*";

Строка 44:
Код

Result->Append(Result->Strings[i] + "\\"+ sr.Name);

Автор: borisbn 2.4.2010, 14:29
Domain, а у тебя в задаче было: "... без использования рекурсии" ?

Автор: Domain 2.4.2010, 19:58
вообще то желательно. а как переписать код правильно?

Добавлено @ 20:06
не так она вроде как и работает рекурсивно. хм... теперь осталось все это дело грамотно распределить в TreeView. 
У меня все еще пару вопросов осталось. 
1. как мне например в TreeView по нажатию на определенную папку получать ее путь. например если кликаем на --dir1.3.2 то получаем примерно C:\Dir1\dir1.3\dir1.3.2 ???
2. Можно ли как нибудь поместить checkbox в TreeView ?

Автор: DCamer 2.4.2010, 20:24
Цитата(Domain @  2.4.2010,  20:58 Найти цитируемый пост)
2. Можно ли как нибудь поместить checkbox в TreeView ?

Переписав компонент под свои нужды  smile 

Автор: Domain 2.4.2010, 21:19
а что насчет первого вопроса?

Автор: DCamer 2.4.2010, 21:21
Domain, про первую не знаю, а второе можно организовать компонентой VirtualTreeview

Автор: Domain 2.4.2010, 22:43
Цитата(DCamer @ 2.4.2010,  21:21)
Domain, про первую не знаю, а второе можно организовать компонентой VirtualTreeview

а подробнее?

Автор: DCamer 2.4.2010, 22:50
Domain, устанавливаешь с сайта компонент (http://www.soft-gems.net/index.php?option=com_content&task=view&id=30&Itemid=35), и в свойства этого компонента есть Checked, и появляются те самые "флажки"

Автор: Domain 2.4.2010, 23:18
Цитата(DCamer @ 2.4.2010,  22:50)
Domain, устанавливаешь с сайта компонент (http://www.soft-gems.net/index.php?option=com_content&task=view&id=30&Itemid=35), и в свойства этого компонента есть Checked, и появляются те самые "флажки"

и он по свойствам такой же как TreeView?

Автор: DCamer 2.4.2010, 23:39
Domain, нет(( такой TreeView какой вы хотите только в VS++

Автор: Domain 2.4.2010, 23:43
поставил...что то я не могу его теперь в билдере найти.

Автор: DCamer 2.4.2010, 23:51
Domain, А компонент установить? (.exe устанавливает папку с файлами для установки, а устанавливать надо вручную)

Автор: Domain 2.4.2010, 23:56
окей. ставить как всегда?

Автор: DCamer 3.4.2010, 00:04
Domain, сначало VirtualTreesC6.bpk - Make, VirtualTreesC6D.bpk - Install, если при установке появится ошибка, то удали справо в Requires файл ThemeManagerC6.bpi

Автор: Domain 3.4.2010, 00:20
Цитата(DCamer @ 3.4.2010,  00:04)
Domain, сначало VirtualTreesC6.bpk - Make, VirtualTreesC6D.bpk - Install, если при установке появится ошибка, то удали справо в Requires файл ThemeManagerC6.bpi

удалил. потом сделал compile VirtualTreesC6 в процессе появились ошибки:

[Pascal Fatal Error] VirtualTrees.pas(325): File not found: 'ThemeSrv.dcu'
[Linker Fatal Error] Fatal: Unable to open file 'VIRTUALTREES.OBJ'

Автор: DCamer 3.4.2010, 00:30
Domain, В Include Path и Library Path укажите пути к \Soft Gems\Virtual Treeview\Source, $(BDS)\Projects\Bpl и $(BDS)\Projects\BPL, последнее также в Package output directory и BPI/LIB output directory

Автор: Domain 3.4.2010, 00:41
сделал... все равно пишет [Linker Fatal Error] Fatal: Unable to open file 'VIRTUALTREES.OBJ' хотя на delphi поставил и все гуд, только там мне он не надо)))

Добавлено через 11 минут и 10 секунд
Include Path где его искать?

Автор: Domain 3.4.2010, 01:02
да не чет не ставит. ладно

Автор: DCamer 3.4.2010, 01:04
Цитата(Domain @  3.4.2010,  01:41 Найти цитируемый пост)
Include Path

В настройках, в Path and Directories

Автор: Domain 5.4.2010, 09:25
блин все перепробовал. выдает мне 

[Pascal Fatal Error] VirtualTrees.pas(325): File not found: 'ThemeSrv.dcu'
[Linker Fatal Error] Fatal: Unable to open file 'VIRTUALTREES.OBJ' 

Автор: Rofar 11.4.2011, 17:56
тажа ошибка((

Автор: DCamer 1.5.2011, 16:30
Rofar, установки, таки происходит автоматически, компонента в Virtual Controls.

Автор: DCamer 1.5.2011, 17:28
Хотя, наверное, уже поздно, но всё же вот:
Код

   if (TreeView1->Selected) {
       Edit1->Text=TreeView1->Selected->Text;
   }
   if (TreeView1->Selected->Parent) {
       Edit1->Text= TreeView1->Selected->Parent->Text + "/" + TreeView1->Selected->Text;
   }
   if (TreeView1->Selected->Level == 2) {
        AnsiString par1 = TreeView1->Selected->Parent->Parent->Text + "/";
        Edit1->Text= par1 + TreeView1->Selected->Parent->Text + "/" + TreeView1->Selected->Text;
   }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)