Построение дерева каталога диска в TreeView на C++Builder

alex_dss
Дата: 11.03.2015 14:20:37
Всё в этом мире уже когда где то происходило, но при всём при этом обращаюсь за помощью.

Задача до боли проста - это часть каталога диска надо поместить в компонент TreeView(только папки,без файлов). Используя собственные знание и интернет практически решена, но структура выводится не в том порядке в каком надо. Если кому не трудно, укажите нерадивому, то биш мне, ошибку в коде, А ТО ВРЕМЯ ЖМЁТ НЕЩАДНО, ЗАРАНЕЕ БЛАГОДАРЕН.
Перелопатил инет, ответа не нашёл.

Вот собственно и сам код:
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

AnsiString Src;
TTreeNode *Node;
AnsiString Dir1;
int n=0;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------

//

void __fastcall TForm1::Button1Click(TObject *Sender)
{

Dir1 = "D:\\" ;
int n=0;
TreeView1->Items->Add(NULL,Dir1);
Node=Form1->TreeView1->Items->Item[n];
CreateTreeView(Dir1, Node);
}
//---------------------------------------------------------------------------



void __fastcall TForm1::CreateTreeView(AnsiString Dir, TTreeNode *Root)
{
    TSearchRec sr;
    Src = Dir;

    if (FindFirst(Src+"\\*", faAnyFile, sr) == 0)
    {
	do
        {
	    if (sr.Name!=".")
            if (sr.Name!="..")
	    {
               Dir =  Src+"\\"+sr.Name;
               Root = TreeView1->Items->AddChild(Root,sr.Name);
               //
  	      CreateTreeView(Dir, Root);  // РЕКУРСИВНЫЙ ВЫЗОВ
             n++;
	    }

          } while (FindNext(sr) == 0);
    FindClose(sr);
 }
}

надо в файл Unit1.h добаввить:
void __fastcall CreateTreeView(AnsiString Dir, TTreeNode *Root);
Leonid Kudryavtsev
Дата: 11.03.2015 14:29:24
Что значит "не в том порядке". В коде негде сортировки не видно, т.ч. порядок должен быть "по умолчанию" ))) /как ос на жесткий диск положит/
mayton
Дата: 11.03.2015 14:32:58
alex_dss, если это NTFS - то порядок файлов и каталогов будет (приблизительно) алвавитный.
Если FAT (флешка) - то возможен случайный порядок. Возможен также вариант что сам компонент
TreeView1 имеет свои преференции и настройки по сортировке элементов.

Вобщем в этом уравнении много неизвестных и постарайся эти неизвестные раскрыть.

P.S. По сабжу С++ Builder - не очень популярная среда и мало кто помнит как оно внутре и что там к чему.
Вобщем помогай нам чтоб мы тебе помогли.
MasterZiv
Дата: 11.03.2015 14:33:00
alex_dss,

Так ты вообще никакой порядок не задаёшь, вот :

    if (FindFirst(Src+"\\*", faAnyFile, sr) == 0)
    {
	do
        {
	    if (sr.Name!=".")
            if (sr.Name!="..")
	    {
               Dir =  Src+"\\"+sr.Name;
               Root = TreeView1->Items->AddChild(Root,sr.Name);


Приходит всё в дерево ровно в том виде, в котором записи выдаёт FindFirst.

Соответственно, чтобы задать какой-то порядок, нужно накопить эти записи в
какую-то структуру данных, а потом её отсортировать в нужном порядке, и
после этого уже записывать в TreeView1.
alex_dss
Дата: 11.03.2015 14:50:29
Leonid Kudryavtsev,

может неправильно выразился, сортировка никакая не нужна , просто надо в TreeView вывести структуру каталога с подпапками, а у меня получается что подпапки выводятся не в тех местах где надо, т.е. нарушена структура подчинения.
Допустим на диске есть папка Temp со множеством вложенных папок, так вот при выводе в TreeView надо чтобы эта структура подчинения сохранилась.
egorych
Дата: 11.03.2015 15:00:05
alex_dss
при выводе в TreeView надо чтобы эта структура подчинения сохранилась.
так ты в своей функции всё время Root перезаписываешь, а потом удивляешься, что структура поломалась.
alex_dss
Дата: 11.03.2015 15:00:47
mayton,

может неправильно выразился, сортировка никакая не нужна , просто надо в TreeView вывести структуру каталога с подпапками, а у меня получается что подпапки выводятся не в тех местах где надо, т.е. нарушена структура подчинения.
Допустим на диске есть папка Temp со множеством вложенных папок, так вот при выводе в TreeView надо чтобы эта структура подчинения сохранилась.

в общем в TreeView должна получится часть диска начинаяя от определённой заданной папки с точно такой же структурой подчинения как и надиске
alex_dss
Дата: 11.03.2015 15:02:04
egorych,
собственно поэтому и написал на форум с просьбой помочь
egorych
Дата: 11.03.2015 15:05:31
alex_dss
egorych,
собственно поэтому и написал на форум с просьбой помочь
так заведи в цикле отдельную переменную под то, что тебе возвращает AddChild и в рекурсивном вызове используй её, а не тот Root, который тебе в функцию пришёл
alex_dss
Дата: 11.03.2015 15:33:59
egorych
alex_dss
egorych,
собственно поэтому и написал на форум с просьбой помочь
так заведи в цикле отдельную переменную под то, что тебе возвращает AddChild и в рекурсивном вызове используй её, а не тот Root, который тебе в функцию пришёл


а примерчик если можно, а то в теории я это знаю, а как вот реализовать, нет