Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2008, 13:56   #1
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию Каталоги в TreeView

Вот нашел на форуме вывод всех файлов и папок начиная с заданной директории.
Код:
//процедура сканирования
procedure Tfmain.ScanDir(StartDir: string; Mask:string);
var SearchRec : TSearchRec;
    oldnod: TTreeNode;
begin
if Mask='' then Mask:='*.*';
if StartDir[Length(StartDir)]<>'\' then
StartDir:=StartDir+'\';
if <span class="highlight">FindFirst</span>(StartDir+Mask, faAnyFile, SearchRec)=0 then
repeat
Application.ProcessMessages;
if (SearchRec.Attr and faDirectory)<>faDirectory then
mnod:=TreeView1.Items.AddChild(nnod,SearchRec.Name) else
if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
begin
oldnod:=nnod;
nnod:=TreeView1.Items.AddChild(nnod,SearchRec.Name+'\');
ScanDir(StartDir + SearchRec.Name + '\',Mask);
nnod:=oldnod;
end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;

//вызов процедуры
procedure Tfmain.mFileNewClick(Sender: TObject);
var StartDir: string;
begin
//тут любым способом задаем начальный каталог
StartDir:='G:';
TreeView1.Items.BeginUpdate;
TreeView1.SortType:=stNone;
TreeView1.Items.Clear;
nnod:=TreeView1.Items.AddFirst(nil,StartDir);
ScanDir(StartDir,'');
TreeView1.SortType:=stText;
TreeView1.Items.EndUpdate;
Application.ProcessMessages;
end;
Но возникла пара вопросов:
1. Как при двойном клике на Item проверить файл ли это (тут в принципе FileExist помог бы если бы я знал полный путь к файлу)
2 Как получить полный путь к нему.

Помогите плз.
Airou вне форума Ответить с цитированием
Старый 31.05.2008, 14:39   #2
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Ня

Код:
procedure TForm1.TreeView1DblClick(Sender: TObject);

var path:string;

   Function recGetPath(node:TTreeNode):TTreeNode;
   begin
      If node.Text<>startdir then
        begin
          path:=node.Text+path;
          recGetPath(node.Parent);
        end
      else path:=node.Text+'\'+path;
   end;

   Function isDirectory(s:string):boolean;
   begin
     result := GetFileAttributes(pchar(path)) and faDirectory = faDirectory;
   end;

begin
  recGetPath(TreeView1.Selected);
  Label2.Caption:=path;
  If isDirectory(path) then Label2.Caption:=Label2.Caption+ ' - это папка'
  else Label2.Caption:=Label2.Caption+ ' - это файл'
end;
Тока сделай у себя переменную StartDir глобальной, и надо ещё прикрутить проверку, выделен ли какой-то узел в дереве, а то тут рекурсия - того и гляди уйдёт в вечный цикл )))
пыщь

Последний раз редактировалось JTG; 31.05.2008 в 14:42.
JTG вне форума Ответить с цитированием
Старый 01.06.2008, 14:39   #3
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Спс большое

И еще пытался переделать первый код под отображение doc файлов но чет не получается... поправте плз

Цитата:
....
if (SearchRec.Attr and faDirectory)<>faDirectory then
begin
if Copy(SearchRec.Name,Length(SearchRe c.Name)-4,4)='.doc' then
mnod:=TreeView1.Items.AddChild(nnod ,SearchRec.Name) end else;
if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
begin
oldnod:=nnod;
nnod:=TreeView1.Items.AddChild(nnod ,SearchRec.Name+'\');
ScanDir(StartDir + SearchRec.Name + '\',Mask);
nnod:=oldnod;
end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
ЗЫ Function isDirectory(s:string)

ЗЗЫ Где-то обнуляеться path вроде тут если правильно отследил... возможно из-за того что имя папки на русском языке написано... ибо глянул инспектором path становится=''?
Код:
Function TForm7.isDirectory(path:string):boolean;
begin
  result := GetFileAttributes(pchar(path)) and faDirectory = faDirectory;
end;

Последний раз редактировалось Airou; 01.06.2008 в 16:57.
Airou вне форума Ответить с цитированием
Старый 01.06.2008, 23:58   #4
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Вроде решил проблему. С переменными путаница была.
Airou вне форума Ответить с цитированием
Старый 05.06.2008, 21:40   #5
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Что тоя на днях открыл исходник программы и пытался разобрать работу ScanDir(StartDir: string; Mask:string)
mnod - файловая ветка
nnod - ветка для папки
одвтщву - ?? что это
... но чтото никак не могу понять что тут делаеццо
Код:
if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then  
 begin  
 oldnod:=nnod;  
 nnod:=TreeView1.Items.AddChild(nnod,SearchRec.Name+'\');  
 ScanDir(StartDir + SearchRec.Name + '\',Mask);  
 nnod:=oldnod;  
 end;
Прокоментите плз что это за присвоения туда-сюда?

А все разобрался.

Последний раз редактировалось Airou; 05.06.2008 в 23:34.
Airou вне форума Ответить с цитированием
Старый 18.11.2008, 15:32   #6
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Ня

Код:
procedure TForm1.TreeView1DblClick(Sender: TObject);

var path:string;

   Function recGetPath(node:TTreeNode):TTreeNode;
   begin
      If node.Text<>startdir then
        begin
          path:=node.Text+path;
          recGetPath(node.Parent);
        end
      else path:=node.Text+'\'+path;
   end;

   Function isDirectory(s:string):boolean;
   begin
     result := GetFileAttributes(pchar(path)) and faDirectory = faDirectory;
   end;

begin
  recGetPath(TreeView1.Selected);
  Label2.Caption:=path;
  If isDirectory(path) then Label2.Caption:=Label2.Caption+ ' - это папка'
  else Label2.Caption:=Label2.Caption+ ' - это файл'
end;
Тока сделай у себя переменную StartDir глобальной, и надо ещё прикрутить проверку, выделен ли какой-то узел в дереве, а то тут рекурсия - того и гляди уйдёт в вечный цикл )))
Почему оно в этом месте может вылетать с ошибкой Access violation with adresss.... ? Кликаю на файле, который расположен в каталоге StartDir
yulia вне форума Ответить с цитированием
Старый 18.11.2008, 15:37   #7
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию

Airou, как я понимаю ты делал, чтобы оно отображало только доки.... Если есть возможность, можешь кинуть код, плиз...
yulia вне форума Ответить с цитированием
Старый 18.11.2008, 16:17   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от yulia Посмотреть сообщение
Почему оно в этом месте может вылетать с ошибкой Access violation with adresss.... ? Кликаю на файле, который расположен в каталоге StartDir
Только потому, что TreeView1.Selected есть NIL.

Кстати, вам поможет отличный пример у вас под ногами:
Borland\Delphi7\Demos\Virtual Listview

Методика есть, осталось переделать чуток по дерево.
mihali4 вне форума Ответить с цитированием
Старый 18.11.2008, 16:44   #9
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию

почему nil? При отслеживании в этой строке обе сраниваемые переменные имеют значение....
yulia вне форума Ответить с цитированием
Старый 18.11.2008, 16:57   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А-а-а, так у вас функция recGetPath сама себя рекурсивно вызывает...
И что будет, если node.Parent=nil ? То есть нода находится в корне...
Вот вам и Access violation.
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TreeView и БД Constellation БД в Delphi 12 27.09.2008 15:22
TreeView _SERGEYX_ Общие вопросы Delphi 1 01.09.2008 17:29
Treeview forzi Помощь студентам 4 04.05.2008 23:50
TreeView и текст Stanislav Общие вопросы Delphi 5 28.03.2008 00:25