Текущий архив: 2008.03.09;
Скачать: CL | DM;
Вниз
Поиск файлов и TreeView Найти похожие ветки
← →
DDR (2008-02-09 20:34) [0]Добрый вечер, уважаемые мастера!
Помогите пожалуйста разобраться, запутался, сил уже нет.
Задача такая: Попытка написать прогу типа проводника.
Если найдена директория (папка), то добавить в 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)
← →
trubin © (2008-02-09 20:58) [1]А компоненты TShellTreeView, TShellListView, TShellComboBox не подойдут.
Ну а так рекурсию тебе в руки.
← →
DDR (2008-02-09 21:04) [2]Я с ними уже повозился. результаты нормальные. Но мне хочется лучше изучить данный компонент.
← →
trubin © (2008-02-09 21:14) [3]
> Но мне хочется лучше изучить данный компонент.
TTreeView изучить что-ли? Так читай хелп.
Что конкретно не понятно?
← →
DDR (2008-02-09 21:19) [4]Мне немного не понятно, как добавить первичный узел, если найдена папка, и добавить дочерний узел, если найдены файлы в этой папке.
← →
trubin © (2008-02-09 21:24) [5]
> Мне немного не понятно, как добавить первичный узел, если
> найдена папка, и добавить дочерний узел, если найдены файлы
> в этой папке.var
n, n1: TTreeNode;
//Добавление в корень
n:= TreeView1.Items.Add(nil, "Root");
//добавление дочернего узла
n1:= TreeView1.Items.AddChild(n, "ChildRoot");
← →
DDR (2008-02-09 21:28) [6]trubin, спасибо за помощь!
Но я с этим разобрался.
Меня интересует другая тема, если найдена папка, как добавить в корень, а если в этой папке файлы, то как добавить дочерний узел?
Точнее, как в данном случае правильно использовать FindFirst, FindNext ?
← →
trubin © (2008-02-09 21:46) [7]Ты уж определись, чего надо. Я же говорил рекурсивно:
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;
← →
trubin © (2008-02-09 21:47) [8]
> s:= "E:\test";
В смысле C: как ты хотел
← →
trubin © (2008-02-09 21:53) [9]А вообще это не правильный путь т.к. занимает время и память.
Правильно для начала показывать только первый уровень. Если у папки есть потомки, то не заполнять ими ветку, а создавать один временный дочерний узел - чтобы "крестик" появился. Когда юзер щелкает по крестику, происходит событие TTreeView.OnExpanding, в котором и заполнять соответствующую ветку.
← →
DDR (2008-02-10 14:41) [10]Спасибо за помощь!
Все во всем разобрался! На счет памяти - все ок. Код немного оптимизировал. Все работает нормально.
Спасибо ещё раз большое!
Страницы: 1 вся ветка
Текущий архив: 2008.03.09;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.018 c