Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

подскажите, как показать все дирректории диска в виде дерева? [D5]


stilet ©   (2002-11-04 08:56:00) 

Знатоки, подскажите, как показать все дирректории диска в виде дерева? Т.е. есть задача получить список дирректорий, входящей в заданную, потом далее из этих получить список, и т.д. до тек пор, пока не получим имена всех дирректорий. Результат можно просто добавлять в мемо.


Separator   (2002-11-04 12:05:00) [1]

Согласен, просто это будо быстрее написать :)


Alex4444444444   (2002-11-04 11:57:00) [2]

Ето будет работать слишком медленно. Лучше отсканировать корень и всем добавленным TTreeNode дать HasChildren := True (нарисовать плюсик). Потом в OnExpanding сканировать соответствующий каталог и добавлять Nodes. (Можно также вынести сканирование детей в отдельный Thread.)


Separator   (2002-11-04 11:49:00) [3]

procedure TForm1.FindDirs(Drive: string; TreeNodes: TTreeNodes);
procedure Find(const Path: string; Tree: TTreeNode);
var
SearchRec: TSearchRec;
begin
if FindFirst(Path + "*.*", faAnyFile, SearchRec) = 0 then
repeat
with SearchRec do
if (Name <> ".") and (Name <> "..") and ((Attr and faDirectory) = faDirectory) then
Find(Path + Name + "\", Tree.Owner.AddChild(Tree, Name))
until FindNext(SearchRec) <> 0;
FindClose(SearchRec)
end;
begin
TreeNodes.Clear;
SetLength(Drive, 3);
Drive:= Drive[1] + ":\";
Find(Drive, TreeNodes.Add(nil, copy(Drive, 1, 2)))
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FindDirs(Edit1.Text, TreeView1.Items);
end;


Separator   (2002-11-04 11:27:00) [4]


procedure TForm1.FindDirs(Drive: string; List: TStrings);

function Space(Count: word): string;
var
i: integer;
begin
Result:= "";
if Count > 0 then
for i:= 0 to Count do
Result:= Result + #32
end;

procedure Find(const Path: string; const Level: word);
var
SearchRec: TSearchRec;
begin
if FindFirst(Path + "*.*", faAnyFile, SearchRec) = 0 then
repeat
with SearchRec do
if (Name <> ".") and (Name <> "..") and ((Attr and faDirectory) = faDirectory) then
begin
List.Add(Space(Level) + Name);
Find(Path + Name + "\", Level + 1)
end
until FindNext(SearchRec) <> 0;
FindClose(SearchRec)
end;
begin
List.Clear;
SetLength(Drive, 3);
if Drive[2] <> ":" then
Drive[2]:= ":";
if Drive[3] <> "\" then
Drive[3]:= "\";
List.Add(Drive);
Find(Drive, 1)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FindDirs(Edit1.Text, ListBox1.Items);
end;


Separator   (2002-11-04 10:57:00) [5]

В мемо даже проще, чем в TreeView


Dr. Web   (2002-11-04 10:29:00) [6]

Идешь на http://www.delphiplus.org- смортишь статью "FastReport: менеджер отчетов - 2" - там все написано (там это дерево присобачено прямо в меню ;)) - от туда мона вырезать куски и сделать то же самое, но с ТриВьювом

P.S. Я так же буду очень благодарен, если вы проголосуете за эту статью. ;)


Anatoly Podgoretsky   (2002-11-04 09:13:00) [7]

Если в мемо то тебе придется использовать пробелы в начале каждой строки, для выделения уровней.
А так это извечный вопрос данного форуму, не снимаемое заклятие. Ответ есть в ЧаВо


Song   (2002-11-04 09:03:00) [8]

Соседняя ветка!


Наверх

Титульная страница Поиск, карта сайта Написать письмо