Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TreeView: неправильно создаются дочерние узлы. Помогите! [D5, WinXP]


Al_delta ©   (2007-07-22 18:55:00) 

Здраствуйте.

Дерево создается програмно, на основе файла записи (record'a). Record
имеет такой вид:

категория     (category);
артикул        (articul);
наименование(name);
цена             (cena);

Сначала создается одноуровневое дерево по названиям категорий, например:

одежда
одежда
одежда
инструменты
инструменты
инструменты
обувь
обувь


Потом в цикле все совпадающие названия категорий (кроме одной) удалятся.
К оставшимся категориям новые узлы присоединяются вот таким вот макаром:


for i:=0 to TreeView2.Items.Count-1 do
for j:=1 to 10 do
Begin
if TreeView2.Items.Item[i].text=wprice[j].category then
TreeView2.Items.AddChild(TreeView2.Items.Item[i], wprice[j].name);
End;


Должно было получится так:
одежда
    шапка
    футболка
инструменты
    тесак   
    скальпель
обувь
    кеды

Но...
Но новые узлы добавляются только к первой ветке, остальные игнорируются.
Помогите


MsGuns   (2007-07-25 11:08:00) [1]

Так, как в сабже, с деревьями не работают, а работают так:
Сначала создается входной НД в строго определенной последовательности (которая обычно строго соответствует "классическому" разузлованию методом рекурсии) - он уже изначально посортирован "правильно". Для каждой "пары" может присутствовать уровень (хотя и не обязательно - но весьма полезно при отладке)
Далее этот НД последовательно просматривается и для каждой пары сначала создается TTreeNode, а затем он добавляется либо как очередной к текущему узлу (если уровень тот же, что и предыдущаяя пара) либо как дочерний к текущему (если уровень больше), либо побъем по дереву (Node := Node.Parent) до тех пор, пока уровень не совпадет (если в паре есть уровень) либо не совпадут идентификаторы ("владелец" в "паре" = Node.Text)
После обработки пары вновь созданный узел становится текущим и обрабатывается следущая запись входного НД


TStas   (2007-07-24 23:22:00) [2]

А можно ведь куда как проще:
1. Создать List: TStringList
2. Циклом if List.IndexOf(category) = -1 then //То. е. если еще не создано
 begin
 n := List.Add(category);
 TreeNode := TreeView1.AddNode(nil, category); //Добавили узел с именем категории
 List.Objects[n] := TreeNode; //И запомнили указатель на узел
 end;
3. Циклом по Вашему файлу, который зачем-то заменяет собой нормальную базу:
//Код внутри цикла
n := List.IndexOf(category); //Нашли категорию в списке
TreeNode := TTreeNode(List.Objects[n]); //И указатель на узел
NewNode := TreeView1.AddNode(TreeNode, 'Текст узла'); //Добавили дочерний узел и получили на него указатель
//Назначили картиночки узлам

Так ведь проще и быстрее.


sniknik   (2007-07-22 20:13:00) [3]

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

неохота даже вникать зачем они у тебя сначала создаются потом удаляются, потом еще циклы... нафига так много лишних действий вместо простейшего цикла, который мог быть таким.

StoredName:= '';
while not DataSet.eof do begin
 st:= DataSet.FieldByName(category).AsString ;
 if StoredName <> st
   then begin
     StoredName:=  st;
     Root:= TreeView.Items.Add(nil, st);
   end;

 TreeView.Items.AddChild(Root, DataSet.FieldByName('name').AsString);

 DataSet.Next;
end;


и все, это сформирует твой двухуровневый справочник -> "Должно было получится так:"
естественно, DataSet должен быть отсортирован(/либо получен запросом с order by) по полю category до цикла.


Наверх

Титульная страница Поиск, карта сайта Написать письмо