![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск файлов и TreeView [D7, XP]
DDR © (2008-02-09 20:34:00)Добрый вечер, уважаемые мастера!
Помогите пожалуйста разобраться, запутался, сил уже нет.
Задача такая: Попытка написать прогу типа проводника.
Если найдена директория (папка), то добавить в TreeView как первичный узел,
если найдены файлы в этой папке, то добавить к первичному узлу в качестве Child.
И соответственно для папок и файлов показывать в TreeView соответствующие иконки.
Произвожу поиск, но вижу и то и другое, все в качестве первичного узла во всем компоненте :(
Подскажите пожалуйста!
procedure TForm1.Find;
const t = '*.*';
begin
Dir:= 'C:\';
attr:= faAnyFile;
findfirst(dir+t,attr1,SR);
with treeView1 do
begin
items.Add(nil,sr.Name);
while findnext(SR)=0 do
items.AddChild(nil,sr.Name);
end;
findclose(SR);
end;
p.s. была попытка пробежаться примерно следующим путем, но результат тот же.
if (attr and faDirectory) = faDirectory then
treeview1.iems.AddChild(nil, sr.Name)
DDR (2008-02-10 14:41:00) [1]Спасибо за помощь!
Все во всем разобрался! На счет памяти - все ок. Код немного оптимизировал. Все работает нормально.
Спасибо ещё раз большое!
trubin (2008-02-09 21:53:00) [2]А вообще это не правильный путь т.к. занимает время и память.
Правильно для начала показывать только первый уровень. Если у папки есть потомки, то не заполнять ими ветку, а создавать один временный дочерний узел - чтобы "крестик" появился. Когда юзер щелкает по крестику, происходит событие TTreeView.OnExpanding, в котором и заполнять соответствующую ветку.
trubin (2008-02-09 21:47:00) [3]
> s:= 'E:\test';
В смысле C: как ты хотел
trubin (2008-02-09 21:46:00) [4]Ты уж определись, чего надо. Я же говорил рекурсивно:
procedure TForm1.Fill(ADir: string; AParentNode: TTreeNode);
var
h: THandle;
fData: TWin32FindData;
s: string;
n: TTreeNode;
begin
ADir:= IncludeTrailingBackslash(ADir);
h:= FindFirstFile(PAnsiChar(ADir + '*'), fData);
if h <> INVALID_HANDLE_VALUE then
try
repeat
s:= fData.cFileName;
if (s <> '.') and (s <> '..') then
begin
n:= TreeView1.Items.AddChild(AParentNode, s);
if (fData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then
Fill(ADir + s, n);
end;
until not FindNextFile(h, fData);
finally
Windows.FindClose(h);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
n: TTreeNode;
s: string;
begin
s:= 'E:\test';
n:= TreeView1.Items.Add(nil, s);
Fill(s, n);
end;
DDR (2008-02-09 21:28:00) [5]trubin, спасибо за помощь!
Но я с этим разобрался.
Меня интересует другая тема, если найдена папка, как добавить в корень, а если в этой папке файлы, то как добавить дочерний узел?
Точнее, как в данном случае правильно использовать FindFirst, FindNext ?
trubin (2008-02-09 21:24:00) [6]
> Мне немного не понятно, как добавить первичный узел, если
> найдена папка, и добавить дочерний узел, если найдены файлы
> в этой папке.
var
n, n1: TTreeNode;
//Добавление в корень
n:= TreeView1.Items.Add(nil, 'Root');
//добавление дочернего узла
n1:= TreeView1.Items.AddChild(n, 'ChildRoot');
DDR (2008-02-09 21:19:00) [7]Мне немного не понятно, как добавить первичный узел, если найдена папка, и добавить дочерний узел, если найдены файлы в этой папке.
trubin (2008-02-09 21:14:00) [8]
> Но мне хочется лучше изучить данный компонент.
TTreeView изучить что-ли? Так читай хелп.
Что конкретно не понятно?
DDR (2008-02-09 21:04:00) [9]Я с ними уже повозился. результаты нормальные. Но мне хочется лучше изучить данный компонент.
trubin (2008-02-09 20:58:00) [10]А компоненты TShellTreeView, TShellListView, TShellComboBox не подойдут.
Ну а так рекурсию тебе в руки.