Текущий архив: 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