Форум: "Основная";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизКак в 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c