Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2009.05.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "KOL";
Текущий архив: 2009.05.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
15-1237486668
Andryk
2009-03-19 21:17
2009.05.24
Профессионализм не пропьешь :)))))


3-1221223824
KirillRepin
2008-09-12 16:50
2009.05.24
Загрузка рисунка из БД в TImage


2-1239102808
Alexandra
2009-04-07 15:13
2009.05.24
Locate и поиск далее..


2-1239340712
И. Павел
2009-04-10 09:18
2009.05.24
Отслеживание смены форматов.


15-1233457388
TUser
2009-02-01 06:03
2009.05.24
Асрономия в вопросах и ответах





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский