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

Вниз

TreeView: неправильно создаются дочерние узлы. Помогите!   Найти похожие ветки 

 
Al_delta ©   (2007-07-22 18:55) [0]

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

Дерево создается програмно, на основе файла записи (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;


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

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


 
sniknik ©   (2007-07-22 20:13) [1]

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

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

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 до цикла.


 
TStas ©   (2007-07-24 23:22) [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, "Текст узла"); //Добавили дочерний узел и получили на него указатель
//Назначили картиночки узлам

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


 
MsGuns ©   (2007-07-25 11:08) [3]

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



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

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

Наверх




Память: 0.48 MB
Время: 0.018 c
2-1189325518
qaaqw
2007-09-09 12:11
2007.10.07
Расположение класса в модуле.


15-1189200756
Petr V. Abramov
2007-09-08 01:32
2007.10.07
славные 90-е РФ


2-1189142392
JetuS
2007-09-07 09:19
2007.10.07
Как определить, что мы в Windows Vista?


15-1188900818
oxffff
2007-09-04 14:13
2007.10.07
Выбор Mp3 player


15-1189158558
Сергей2006
2007-09-07 13:49
2007.10.07
unable to locate hyperlink в Help Insight