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

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

Поиск файлов и 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 не подойдут.
Ну а так рекурсию тебе в руки.


Наверх

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