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

Вниз

Как в TVirtualStringTree создать структуру?   Найти похожие ветки 

 
AndrewK ©   (2003-12-22 14:50) [0]

Доброго времени суток.

Есть список:

D\temp
D\temp\mouse
C\windows
C\windows\system32

Как мне сделать в TVirtualStringTree дерево со структурой по данному списку?

Пробовал использовать GetFirstChild(ParentNode) и GetNext. Не получается так как GetNext входит на следующие уровни, по отношению к уровню c Parent = ParentNode, где я провожу поиск.
Сканировать весь список и рассматривать только те, у которых Parent = ParentNode наверное будет тормозить на больших объемах.

Посоветуйте что делать.


 
MV   (2003-12-22 14:57) [1]

...
VST : TVirtualStringTree
...
var
tmpNode: PVirtualNode;
tmpNodeData : PNodeData;
FOnChange: TOnTreeChange;
begin
VST.Clear;
VST.BeginUpdate; // Запрещем обновление

// Строим дерево
...
tmpNode := VST.AddChild(nil);
tmpNodeData := VST.GetNodeData(tmpNode);
tmpNodeData^.NAME := "D\Temp";
...
tmpNode := VST.AddChild(nil);
tmpNodeData := VST.GetNodeData(tmpNode);
tmpNodeData^.NAME := "C:\Windows\System32";

VST.EndUpdate; // Разрешаем обновление

end;

В обработчике OnGetText

procedure Tfrb_Part.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
tmpNodeData: PNodeData;
begin

tmpNodeData := Sender.GetNodeData(Node);
if Column = 0 then CellText := pvstNode^.NAME

Все.


 
AndrewK ©   (2003-12-22 15:10) [2]

Это не то. Дерево не получилось.
Мне надо получить вот что:

D
Temp
Mouse
C
Windows
System32

В общем, должно получиться что-то вроде проводника, только по моим данным.


 
MV   (2003-12-22 15:15) [3]

Ну там пример же есть, один к одному...
А в моем примере - вместо
// Строим дерево
...
tmpNode := VST.AddChild(nil);
tmpNodeData := VST.GetNodeData(tmpNode);
tmpNodeData^.NAME := "D\Temp";
...
tmpNode := VST.AddChild(nil);
tmpNodeData := VST.GetNodeData(tmpNode);
tmpNodeData^.NAME := "C:\Windows\System32";

делаем что-то типа рекурсивной:
BuildVstLevel(Parent_Node);
в теле которой строим очередной уровень для узлов, у который Parent = Parent_Node, а если у узла есть детки, то вызываем еще раз рекурсивно эту процедуру, в качестве Parent_Node указываем текущий узел...


 
AndrewK ©   (2003-12-22 15:42) [4]

Мне такой алгоритм не очень удобен. Для этого мне необходимо получать список потомков для каждого узла.

Я думал что можно сделать так: Берем первую запись, смотрим строку Path, например, "D\temp\test". Смотрим есть ли на первом уровне элемент с именем "D". Если нашел, то начинаем спускаться по его потомкам и искать среди них для второго уровня, соответственно, "temp", для третьего - "test". Если на каком либо уровне ожидаемый элемент был не найден, то с этого уровня добавляем все оставшиеся элементы из строки Path.

Дальше берем вторую запись и повторяем работу.

У меня проблема в том, что я не могу в TVirtualStringTree сделать навигацию по потомкам какого-либо узла. Это вообще можно делать?


 
MV   (2003-12-22 15:51) [5]

А что "не могу"? Обрати внимание на свойства узлов .NextSibling, .PrevSibling
Наверняка поможет :)


 
Jack128 ©   (2003-12-22 15:52) [6]


> Пробовал использовать GetFirstChild(ParentNode) и GetNext.
> Не получается так как GetNext входит на следующие уровни,
> по отношению к уровню c Parent = ParentNode, где я провожу
> поиск

Дочернии узлы сканируются так
Node := GetNextChild(ParentNode);
while Assigned(Node) do
begin
// работаем с узлом
Node := VST.GetNextSibling(Node);
end;

А заполнять дерево лудше используя OnInitNode..


 
MV   (2003-12-22 16:00) [7]

Угу. Можно.


 
Jack128 ©   (2003-12-22 16:03) [8]

Кстати, если мне не изменяет память, то в демке есть некий аналог ShellTree(точно сказать не могу - не дома)


 
MV   (2003-12-22 16:06) [9]

Есть-есть!


 
Reindeer Moss Eater ©   (2003-12-22 16:24) [10]

Кстати, если мне не изменяет память, то в демке есть некий аналог ShellTree(точно сказать не могу - не дома)

Там дурка.
Структура каталогов объявлена статически.
С такой структурой естественно OnInitNode сам собой напрашивается.

Если же хотим реальное дерево каталогов строить - то рекурсия, или отложенное построение чайлдов при выделении родителя.


 
MV   (2003-12-22 16:28) [11]

OnInitNode - вызывается сам, после создание очредного узла. Как только вызывается какой-нить .AddChild, то следом вызывается OnInitNode. Если он определен, ес-нно :)
Просто с целью несколько разбить код на несколько процедур. Хотя я все "вручную" делаю обычно


 
AndrewK ©   (2003-12-22 16:51) [12]

А как это с использованием OnInitNode. Данные, которые надо в DATA загрузить у меня в другом месте лежат.


 
MV   (2003-12-22 16:53) [13]

Ну, все равно ж в пределах видимости класса :)? Например, в том же модуле? Все ж в наших руках.


 
MV   (2003-12-22 16:55) [14]

В общем, глупости все это. Делай, как нравится.


 
AndrewK ©   (2003-12-22 16:58) [15]

Спасибо.



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

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

Наверх




Память: 0.5 MB
Время: 0.017 c
4-25645
ASGroup
2003-11-06 20:37
2004.01.09
Как отловить создание нового окна?


6-25469
lkj
2003-11-07 13:45
2004.01.09
Кодинг сокетов юзая winsock в Дэлфи


1-25393
Sasha_M
2003-12-24 19:30
2004.01.09
Как в Tlistview при нажатии клавиши отметить выбранный


14-25539
Delpher_Gray
2003-12-09 16:43
2004.01.09
Обсуждение ресурсов по программарованию в Delphi


3-25256
PaveLL
2003-12-10 13:28
2004.01.09
sql