Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.19;
Скачать: CL | DM;

Вниз

Файлы и папки в TTreeView   Найти похожие ветки 

 
Kolya ©   (2002-12-09 10:26) [0]

Необходимо показать файлы и папки в иерархическом "дереве". Есть ли ресурсы позволяющие сделать это в компонентах TTreeView и TOutline или придется делать вручную?


 
Song ©   (2002-12-09 10:36) [1]

Конечно вручную с рекурсией.
В Д6 есть правда Shell компоненты, могут пригодиться, но без документации.


 
Separator ©   (2002-12-09 10:45) [2]


function GetDirs(Dir: string; Nodes: TTreeNodes; NodesClear: boolean = false): boolean;
var
Recurse: boolean;

procedure FindDirs(Path: string; Node: TTreeNode);
var
lpFindFileData: _WIN32_FIND_DATAA;
hFindFile: Cardinal;

begin
hFindFile:= Windows.FindFirstFile(PChar(Path + "*.*"), lpFindFileData);
if Windows.GetLastError <> INVALID_HANDLE_VALUE then
repeat
Application.ProcessMessages;
if ((lpFindFileData.dwFileAttributes and $00000010) = $00000010) and (lpFindFileData.cFileName[0] <> ".") then
FindDirs(Path + lpFindFileData.cFileName + "\", Node.Owner.AddChild(Node, lpFindFileData.cFileName))
until not Windows.FindNextFile(hFindFile, lpFindFileData);
Windows.FindClose(hFindFile)
end;

begin
if Dir[Length(Dir)] <> "\" then
Dir:= Dir + "\";
if not DirectoryExists(Dir) then
begin
Result:= false;
exit
end;
if NodesClear then
Nodes.Clear;
FindDirs(Dir, Nodes.AddChild(nil, Copy(Dir, 1, Length(Dir) - 1)));
with Nodes.GetFirstNode do
if HasChildren then
Expand(Recurse);
Result:= true
end;


Dirs - исходная директория
Nodes - любой TreeView.Items


 
Separator ©   (2002-12-09 10:59) [3]

Забыл сказать, что эта функция выдает только каталоги, для файлов нужно заменить:


repeat
Application.ProcessMessages;
if lpFindFileData.cFileName[0] <> "." then
if (lpFindFileData.dwFileAttributes and $00000010) = $00000010 then
FindDirs(Path + lpFindFileData.cFileName + "\", Node.Owner.AddChild(Node, lpFindFileData.cFileName))
else
Node.Owner.AddChild(Node, lpFindFileData.cFileName)
until not Windows.FindNextFile(hFindFile, lpFindFileData);


Бутет работать довольно долго, пока не просканирует все папки начиная с исходной


 
Kolya ©   (2002-12-09 16:05) [4]

Separator, спасибо за код- все работет. Нужно будет добавить в него возможность поиска файлов с маской, но думаю это не составит особово труда.



Страницы: 1 вся ветка

Текущий архив: 2002.12.19;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.011 c
14-61758
Sergey_Suhoy
2002-11-27 12:56
2002.12.19
Как Вы относитесь к тяжелым по характеру людям.


6-61735
ШахтерИЩЕ
2002-10-25 13:13
2002.12.19
Как мне можно поменять сетевое имя компа ...


14-61765
herosofnn
2002-11-27 16:22
2002.12.19
пролог !!!


6-61747
F1
2002-10-23 11:45
2002.12.19
Мастера, посмотрите вот так файлы через Socket перешлются?


1-61621
Анна
2002-12-06 16:31
2002.12.19
использование dll C++ в Delphi