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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2012, 07:29   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Не добавляется дочерний узел в родительский в TreeView

Доброе утро! Сделал поиск номера узла по названию:
Код:
   for i := 0 to Form1.tv_1.Items.Count - 1 do
   begin
     if Pos('Родительский узел',Form1.tv_1.Items[i].Text) > 0 then
     begin
       Form1.tv_1.Items.Item[i].Selected:=True;
       Form1.tv_1.SetFocus;
       Form1.sLabel1.Caption:='';
       Node := Form1.tv_1.Selected;
       if Node <> nil then
       begin
        Index := Integer(Node.Data);
        Form1.sLabel1.Caption:=IntToStr(Index);
        Form1.tv_1.Items.AddChild(Form1.tv_1.Items[Index],
                                          Trim(Form13.sEdit4.Text) + ' ' +
                                          Trim(Form13.sEdit5.Text) + ' ' +
                                          Trim(Form13.sEdit6.Text));
        Node.ImageIndex:=63;
        Node.SelectedIndex := Node.ImageIndex;
        Node.Data := Pointer(IndexValue);
       end;
     end;
   end;
Узел находится. Его индекс заносится в sLabel1. До не добавляется дочерний узел. Мне нужно добавить дочерний узел в тот родительский, индекс которого я получил при поиске. А сейчас дочерний узел создается четвертым по счету. Просто если пересчитать все узлы дерева начиная с самого верхнего (0,1,2,3...), то мой дочерний добавляется как четвертый. А мне надо его добавить так как я сказал выше. Что я не так делаю? Или не дописал.

Кстати, каждому новому добавленному узлу должен присваиваться свой индекс. Но, это я сам сделаю. Помогите с добавлением.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 11.05.2012, 07:40   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вообще-то значение из поля Data имеет слабое отношения к индексу в Items, даже если в Data действительно изначально помещен индекс из Items. Любое добавление-удаление узла может изменить положение остальных узлов в Items. И создавал бы Form1.tv_1.Items.AddChild(Node,...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.05.2012, 07:42   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Ну а сам-то код правильно составлен? Цикл и добавление? Попробую пока использовать Node

----
Ага, вроде сработало. Аватар, в очередной раз спасибо!!! Осталось разобраться с присвоением картинки добавленному узлу. А то сейчас получается, что у меня у родительского узла меняется картинку на картинку, которая должна быть у добавленного дочернего...
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 11.05.2012 в 07:49.
artemavd вне форума Ответить с цитированием
Старый 11.05.2012, 07:51   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мое видение:
Код:
   
with Form1.tv_1 do
for i := 0 to Items.Count - 1 do   begin
     if Pos('Родительский узел',Items[i].Text) > 0 then     begin
       Form1.sLabel1.Caption:='';
       Node := Form1.tv_1.Selected;
       if Node <> nil then   begin
        Form1.sLabel1.Caption:=IntToStr(I);
        Items.AddChild(Items[i],
                                          Trim(Form13.sEdit4.Text) + ' ' +
                                          Trim(Form13.sEdit5.Text) + ' ' +
                                          Trim(Form13.sEdit6.Text));
        Node.ImageIndex:=63;
        Node.SelectedIndex := Node.ImageIndex;
        Node.Data := Pointer(IndexValue);
       end;
     end;
   end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.05.2012, 07:52   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Проверка Node на nil в данном случае излишня. И начиная с Node.ImageIndex:=63; обрабатывается не вновь созданный узел, хотя думаю имелось ввиду обработка как раз нового узла. И желателен после этого принудительный выход из цикла. Дальше зачем проверять? Ну и если найдутся вруг узлы с таким же текстом, то что будет?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.05.2012, 07:58   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
хотя думаю имелось ввиду обработка как раз нового узла
Да, надо обрабатывать вновь добавленный узел.
Цитата:
Ну и если найдутся вруг узлы с таким же текстом, то что будет?
Ну, пользователь просто не сможет добавить в дерево узел, если он там присутствует. Так заложено логикой работы программы.
Цитата:
Мое видение:
Ща, тоже погляжу, попробую

----
Виталий, чо-т ничо не добавилось в дерево.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 11.05.2012 в 08:02.
artemavd вне форума Ответить с цитированием
Старый 11.05.2012, 08:08   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Надо смотреть весь проект. По одному куску не особо поймешь что ты хотел сделать.
Или хотя бы скрины выложи покажи что хочешь. Я просто предположил что тебе подобное нужно, но задание не оч. понял.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.05.2012, 08:16   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Да собственно и скринировать-то нечего. Задача простая: найти по названию узел в дереве, получить его индекс, посчитать количество всех узлов дерева, добавить дочерний узел в найденный по тексту родительский узел и присвоить новому дочернему узлу индекс (который можно сформировать, например, из получив количество всех узлов дерева). Вот так. А, да, дочернему узлу присвоить картинку отличную от картинки родительского узла, которая должна остаться неизменной при добавлении в него дочернего узла.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 11.05.2012, 08:36   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Попробуй так (в дельфи не проверял)
Код:
for i := 0 to Form1.tv_1.Items.Count - 1 do
  if Pos('Ðîäèòåëüñêèé óçåë',Form1.tv_1.Items[i].Text) > 0 then begin
    Form1.tv_1.Items.Item[i].Selected:=True;
    Form1.tv_1.SetFocus;
    Form1.sLabel1.Caption:='';
    Index:=Integer(Form1.tv_1.Selected.Data);
    Form1.sLabel1.Caption:=IntToStr(Index);
    Node:=Form1.tv_1.Items.AddChild(Form1.tv_1.Selected,
                                    Trim(Form13.sEdit4.Text) + ' ' +
                                    Trim(Form13.sEdit5.Text) + ' ' +
                                    Trim(Form13.sEdit6.Text));
    Node.ImageIndex:=63;
    Node.SelectedIndex := Node.ImageIndex;
    Node.Data := Pointer(IndexValue);
    Break;
  end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.05.2012, 09:10   #10
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Аватар, не устаю тебя благодарить . Спасибо, это сработало вроде пока что. А как теперь присвоить индекс для добавленного дочернего узла? A то если выбираешь его, то он пишет "0", что естественно, т.к. я же не задаю ему номер явно.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 11.05.2012 в 11:16.
artemavd вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TreeView выделить дочерний узел Dozent Общие вопросы Delphi 1 02.05.2012 08:34
Программно выделить узел в TreeView, зная иерархический путь. PATRI0T Компоненты Delphi 0 16.04.2012 21:24
Как лучше (надежнее) удалить узел из TreeView? artemavd Общие вопросы Delphi 2 07.04.2012 20:39
сделать недоступным узел в TreeView Don Karleone Общие вопросы Delphi 5 21.02.2011 23:46
Как выделить узел в TreeView inndim Общие вопросы Delphi 3 23.10.2008 13:32