Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.24;
Скачать: CL | DM;

Вниз

Добавление пути в дерево   Найти похожие ветки 

 
Ash-911   (2008-01-21 20:22) [0]

Прошу помочь мне с небольшой проблемкой: есть дерево (допустим файлов), и есть путь до определённого файла. Вот... Хотелось бы добавить этот путь в дерево, при этом добавляются только оригинальные узлы.
Вот маленький вариант кода (примерный):

function AddPath(Path: string; Delimiter: char; Tree: TTree): TTree;
var
 List: TList;
 Node: TTree;
 i: integer;
 s: string;
begin
 Result := nil;
 if (Tree = nil) or (Tree.Items.Count = 0) or (Path = "") or (Delimiter = "") then  exit;          
...   // тут преобразуем путь в список
Node := NewTree();                   // создаём узел  
Node := Tree;              // верна ли такая запись ?        
// Проходим по всему списку уровней пути  
for i := 0 to List.Count - 1 do
 begin
   // Ищем имя ноды на текущем уровне    
     while (Node <> nil) and (Node.Name <> List.items[i]) do
     Node := Node.NextSibling;  // перебираем братьев данного узла (через список)    
   if Node = nil then      // если не текущем уровне такого узла нет
     ... ... ; // добавляем узел                                                
  // Переходим на уровень ниже
   if i < List.Count - 1 then                            
     Node := Node.Items[0];                              
 end;
 List.Free;
 Result := Node;
end;


Понимаю, что тут написана каша полная. Но необходимость в работе с деревом каталогов (файлов) нужна, причём исключительно из памяти, а не через TreeView. Если кто-то сможет помочь, заранее благодарю...  @Copiright  -  ash-911


 
MTsv DN   (2008-01-21 20:53) [1]

TTree??? NextSibling??? А KOL тут причем?


 
Ash-911   (2008-01-21 21:02) [2]

Как это причем? Там же есть невизуальный объект для работы с деревьями. Я же переходу на КОЛ, пытаюсь перенести туда похожую функцию из VCL, но вот беда, собсно...


 
MTsv DN   (2008-01-21 21:24) [3]

Пардона прошу, не посмотрел, что работать надо в памяти...


 
Ash-911   (2008-01-21 21:32) [4]

Да нормально, вот если б кто подсказал как работать...
Есть косяк: там у меня по привычке передаются TTree, а надо указатели: PTree - хотя сам ещё до конца не разобрался.


 
Dimaxx ©   (2008-01-23 16:01) [5]

Сорри за "не совсем" оффтоп. Раз зашел разговор про PTree спрошу тут, чтоб не плодить тем.

Допустим, есть два дерева. Мне нужно присоединить Root второго дерева к одному из узлов первого. Это несложно сделать через Add. Теперь вопрос: как отсоединить второе дерево от узла первого без разрушения второго, т.е. вернуться к состоянию до Add?


 
Vladimir Kladov ©   (2008-01-23 20:36) [6]

Unlink


 
Dimaxx ©   (2008-01-23 21:53) [7]

Плин, ответ рядом был - тока в код заглянуть. Тока Unlink не описан вообще, вот я его и не принимал в расчет. Т.е. Node.Unlink отсоединяет от узла Node прикрепленных к нему потомков без разрушения последних, а fParent.fChildren.Delete(I) просто удаляет ссылки на них из списка PList? Владимир, описание бы добавить нуна, а то хожу вокруг да около и не вижу. А ну как кто также блуждать будет? :)


 
Dimaxx ©   (2008-01-23 21:54) [8]

Вот невежа, "спасибо" забыл сказать! Спасибо...


 
Ash-911   (2008-01-24 07:31) [9]

Ну хорошо. В свете выше сказанного можно модифицировать мой вопрос: если мы это путь предствим в виде ветки дерева (со ссылками), то как нам его добавить и при этом одинаковые узлы не добавлялись бы на каждом уровне?
- имеется ввиду : преобразуем путь до файла в дерево, затем добавляем его так как описано выше (без повтора узлов). Прям счастлив был бы, если б кто помог :)


 
Dimaxx ©   (2008-01-24 11:30) [10]

Я сам только что делал в своем проекте заполнение дерева в памяти сканируя директорию.

Как я понимаю, сначала формируется список файлов в List, а потом происходит заполнение. Чтобы избавится от повтора узлов необходимо перед добавлением нового узла проверить Name остальных узлов у данного родителя на совпадение с добавляемым. Если нет такого - добавить, есть - вернуть индекс имеющегося узла и добавлять к нему. Но проще строить дерево сразу при сканировании. Щас нет под рукой исходника - вечером могу кинуть сюда свой код. Делал так: написал подпрограмму для сканирования указанной директории, что-то типа:

procedure ScanTree(Path: string; Node: PTree);

В нее передаю начальный путь и корень дерева. В ней сканирую файлы и папки. Если найден файл - создаю узел и добавляю его в дерево Node.Add. Если директория, то добавляю имя папки к Path, создаю узел и снова вызываю ScanTree c новым Path и созданным узлом в качестве параметра.


 
Dimaxx ©   (2008-01-24 11:37) [11]

Да, еще забыл добавить. Если предполагается работать с большим кол-вом файлов и папок, то можно нарваться на падение приложения. У меня заранее неизвестно кол-во файлов. Поэтому я динамически создаю дерево. При открытии узла сканирую соответствующую папку и добавляю к узлу, а потом отображаю. При закрытии узла убираю его потомков. Так и памяти меньше расходуется.



Страницы: 1 вся ветка

Текущий архив: 2009.05.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
2-1239087914
JB2
2009-04-07 11:05
2009.05.24
FreeMem в списке


4-1201794430
Ник
2008-01-31 18:47
2009.05.24
Идентификация флешки


15-1237492883
MsGuns
2009-03-19 23:01
2009.05.24
Два украинских ФК в 1/4 финала КУЕФА


2-1239007118
@!!ex
2009-04-06 12:38
2009.05.24
StringReplace не работает с длинными строками?


3-1221562940
Tonich
2008-09-16 15:02
2009.05.24
Параметры транзакции