Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.02 c
14-25512
Думкин
2003-12-16 07:03
2004.01.09
С днем рождения! 16 декабря.


8-25451
NikB
2003-09-09 01:02
2004.01.09
Point In Poligon


3-25241
den777
2003-12-10 15:51
2004.01.09
Dbexpress и DBF


1-25328
It
2003-12-22 15:44
2004.01.09
StringGrid в Excel


1-25335
vasyaVN
2003-12-22 13:01
2004.01.09
Перерисовка компонента ТCustomControl





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский