Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2008, 21:06   #1
Leonis
 
Регистрация: 29.10.2007
Сообщений: 4
По умолчанию Заполнить TTreeView

Вопрос банальнее некуда, а врубиться не могу.
Идея такая.

Есть примерно такая табличка:

# Название #предка
1 ляляля 1
2 111111 1
3 312321 2
4 ролрол 1
5 уокуку 3
.....

Я её хочу закинуть в дерево TreeView:

for i:=1 to pathtableentries do
begin
if i=1 then treeview1.Items.Add( nil, 'R00T' );
if i<>1 then
treeview1.items.AddChild(treeview1. items[PathTableRecord[i].ParentDirectoryNumber-1], PathTableRecord[i].DirectoryIdentifier);
end;

Программа работает, но результат совсем не тот, что должен быть. Некоторые данные совсем не в том месте, где должны находиться, и при нажатии на определённый элемент в дереве, текст выводится верный, а номер явно ошибочный.
Подскажите как правильно заполнить дерево.
Leonis вне форума Ответить с цитированием
Старый 26.03.2008, 21:55   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А вы вот так сделайте:
Код:
var mynode: TTreeNode;
...
if i=1 then 
mynode:=treeview1.Items.Add( nil, 'R00T' ) else
treeview1.items.AddChild(mynode, PathTableRecord[i].DirectoryIdentifier);
mihali4 вне форума Ответить с цитированием
Старый 26.03.2008, 22:17   #3
Leonis
 
Регистрация: 29.10.2007
Сообщений: 4
По умолчанию

Пример компактный, но не совсем подходит.
В этом случае все "элементы" становятся "детьми" узла R00T.

Сорри за плохо заданный вопрос.

Структура данных:

Код:
TPathTableRecord= packed record
  DirectoryIdentifier:string; //Название узла
  ParentDirectoryNumber:word; // номер родителя, которому принадлежит узел
end;

PathTableRecord: Array[1..100] of TPathTableRecord;
В массиве у меня хранятся данные, по которым надо построить дерево, наподобие дерева каталогов.
Все примеры, что я нашёл здесь на форуме, да и в интернете громоздкие и не совсем подходят для моей цели. Подскажите краткое и грамотное решение плизз
Leonis вне форума Ответить с цитированием
Старый 26.03.2008, 22:31   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Если вы отсортируете свой рекорд по индексу предка и по собственному индексу (именно в такой последовательности), то алгоритм будет однопроходным - последовательный просмотр и выбор - или в корень, или в "детки" только что внесенному "предку".
С БД гораздо проще. И, как всегда, структура данных должна облегчать получение результата.
mihali4 вне форума Ответить с цитированием
Старый 26.03.2008, 23:29   #5
Leonis
 
Регистрация: 29.10.2007
Сообщений: 4
По умолчанию

с базами данных намного проще, однозначно

У меня перед сном озарения бывают. Алгоритм наверно не самый лучший, но работает:

Код:
var
nodes:array of tfctreenode;
Код:
setlength(nodes,sizeof(PathTableRecord));
if pathtableentries>0 then begin
 for i:=1 to pathtableentries do
  begin
    if i=1 then treeview1.Items.Add(nil, 'R00T' ) else
       nodes[i-1]:=treeview1.items.AddChild(nodes[PathTableRecord[i].ParentDirectoryNumber-1], PathTableRecord[i].DirectoryIdentifier);
  end;
nodes:=nil;
Говоря простым русским языком, я запоминаю каждое звено, и потом обращаюсь к нему напрямую

Последний раз редактировалось Leonis; 26.03.2008 в 23:47.
Leonis вне форума Ответить с цитированием
Старый 27.03.2008, 00:47   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Одного никак не пойму:
treeview1.Items.Add(nil, 'R00T' )
У вас же этот элемент имеет имя "ляляля"... Вернее, не имя, а текст. А вы почему-то обзываете его ROOT...
mihali4 вне форума Ответить с цитированием
Старый 27.03.2008, 13:02   #7
Leonis
 
Регистрация: 29.10.2007
Сообщений: 4
По умолчанию

Я ведь поправился
В первом посте я закинул в табличку первое, что пришло в голову, чтобы было понятно из чего она примерно состоит. Да и этот 'R00T' - всего лишь рабочее название, первое что пришло в голову на момент написания кода

Вообще, TreeNode's для меня всё равно тёмный-претёмный лес, и надеюсь, что с этим компонентом мне больше не придётся сталкиваться в жизни


Спасибо за советы, сортировка в моём случае была бы не лишней (если бы таблица не была уже отсортирована предварительно) !
Leonis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TTreeView поиск по имени Родион Компоненты Delphi 6 05.05.2008 14:07
перебор всех элементов в TtreeView vitalik007 Общие вопросы Delphi 10 09.04.2008 15:44
где найти нормальный TTreeView andrey4623 Общие вопросы Delphi 6 27.03.2008 00:15
TTreeView alll_23 Общие вопросы Delphi 2 23.10.2007 12:36