Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как перебрать все узлы VirtualTreeView ?


Автор: Erazer 12.6.2008, 11:18
Есть дерево символизирующее файловую систему,каждый узел папка или файл.
Нужно перебрать все ветви и составить список путей к файлам.
Есть зацепка,файлы не имеют дочерних узлов соответственно их можно идентифицировать,знаю как перебрать все узлы,но не знаю как перебрать непосредственно каждую из ветвей.
Т.е. папка "C:\My Music\tags\temp\" выглядит как "C:"+"My Music"+"tags"+"temp"+имена файлов.
нужно собрать все это в строку и перейти на след ветку, вопрос в том как это сделать...
говорят Path реализует то что нужно,но нигде не вижу описания или примера работы с ней  smile 

Автор: MetalFan 12.6.2008, 13:22
GetFirst+GetNext?

Автор: Erazer 12.6.2008, 13:54
Так нечестно!!!Ты знал!!!!! Ты Знал!!!! smile понятно что без этого не обойтись, другой вопрос КАК ИМЕННО? smile 
Код

    for I := 0 to VT.TotalCount - 1 do
    begin
      if I <> 0 then
        NewNode := VT.GetNext(NewNode)
      else
        NewNode := VT.GetFirst;

      FileNode := VT.GetNodeData(NewNode);
      if Assigned(FileNode) then
      begin
        showmessage(VT.Path(NewNode,0,ttNormal,'\'));
      end;
    end;

Такой код дает следующие результаты "c:\","c:\my music\","c:\my music\6chan.ogg\","c:\my music\6chan.wma\"
Теперь думаю как с этим работать, допустим если определять файл это или еще нет чрез наличие расширения, то в случае наличия в названии папки точки,"sdg.sdgfdg786" она воспринимается как файл с расширением :( а проверять через directoryexists не совсем нормально скажем так.. 

Автор: Poseidon 12.6.2008, 15:58
А как у тебя дерево заполняется? Может на этапе заполнения указывать ветке что там файл/папка?

Автор: aktuba 12.6.2008, 19:18
Цитата(Erazer @  12.6.2008,  14:54 Найти цитируемый пост)
Теперь думаю как с этим работать, допустим если определять файл это или еще нет чрез наличие расширения, то в случае наличия в названии папки точки,"sdg.sdgfdg786" она воспринимается как файл с расширением :( а проверять через directoryexists не совсем нормально скажем так.. 

Так проверяй аттрибуты - они дл этого и созданы. Например, faDirectory...

Автор: MetalFan 12.6.2008, 19:41
Цитата(Erazer @  12.6.2008,  13:54 Найти цитируемый пост)
    for I := 0 to VT.TotalCount - 1 do
    begin
      if I <> 0 then
        NewNode := VT.GetNext(NewNode)
      else
        NewNode := VT.GetFirst;
      FileNode := VT.GetNodeData(NewNode);
      if Assigned(FileNode) then
      begin
        showmessage(VT.Path(NewNode,0,ttNormal,'\'));
      end;
    end;

что за бредовый код обхода?
обход дерева VT выглядит проще:
Код

  lNode := VT.GetFirst;
  while Assigned(lNode) do
  begin
    //
    lNode := VT.GetNext(lNode);
  end;

при заполнении дерева ставь флаг, файл это или папка. зачем потом мудрить то?

Автор: Erazer 12.6.2008, 20:38
Цитата(MetalFan @  12.6.2008,  19:41 Найти цитируемый пост)
при заполнении дерева ставь флаг, файл это или папка. зачем потом мудрить то?
  smile  вот оно то что я искал,проверять мне их не надо, я передаю процедуре построения узлов список файлов, если парсить каждую строку с конца то перввый "\"обозначает что все сто после него есть имя файла,+ взвести флаг и потом проверять его наличие.... Всем отозвавшимся большое пасибо!  smile

Добавлено через 11 минут и 30 секунд
странная задумка разрешать менять репутацию только после 100 постов  smile

Добавлено через 13 минут и 18 секунд
Цитата

Опыт сын ошибок трудных.... 

Автор: aktuba 12.6.2008, 23:26
Цитата(Erazer @  12.6.2008,  21:38 Найти цитируемый пост)
я передаю процедуре построения узлов список файлов, если парсить каждую строку с конца то перввый "\"обозначает что все сто после него есть имя файла,+ взвести флаг и потом проверять его наличие.... Всем отозвавшимся большое пасибо!

Уууу... Как все запущено...  smile 

Автор: Erazer 13.6.2008, 13:18
smile ну ПОКА как бы вот так...  smile   smile

Добавлено @ 13:21
я в принципе переосмыслил немного свою вчерашнюю задумку,вспомнил про ExcludeTrailingBackSlash, ExtractFilename, но естественно с удовольствием почитаю альтернативные варианты варианты  smile 

Автор: Erazer 16.6.2008, 05:37
на практике это выглядит так  
Код


  var
    NewNode: PVirtualNode;
    FileNode: PFileNode;
  begin

 NewNode := VT.GetFirst;
while Assigned(NewNode) do
      begin
   FileNode := VT.GetNodeData(NewNode);
     // Делаю что хочу :).
LboxSrcPath.Items.Add(FileNode^.Name);
    //Конец произвола :-)
NewNode := VT.GetNext(NewNode);
      end;

Автор: Erazer 17.6.2008, 16:50
Цитата(aktuba @  12.6.2008,  23:26 Найти цитируемый пост)
Уууу... Как все запущено...

я просто добавил поле в котором если это файл храню полный путь к нему  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)