Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/42: Рейтинг темы: голосов - 42, средняя оценка - 4.76
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109

TreeView - узнать ключ выделенного элемента

11.02.2011, 08:30. Показов 8854. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. У меня такой вопросик: как узнать ключ выделенного элемента в TreeView ... При условии что сам TreeView заполняется из БД... и нужно узнать ключ именно из неё...

Добавлено через 17 часов 51 минуту
если это поможет, то вот так TW заполняется:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
procedure TForm1.AddNode(ToTree:TTreeNode;ToId:cardinal);
var i:cardinal;
    node:TTreeNode;
begin
  // Проверяем каждую запись в базе
  for i:=1 to NodesCount do
  begin
    // Если родитель равен коду записи, то мы добавляем ее в дерево к этому родителю 
      if nodes[i].parent_id=ToId then
    begin
      // Добавляем запись в дерево
      node:=TreeView1.Items.AddChildObject(ToTree,nodes[i].str,Pointer(nodes[i].id));
      // Запускаем рекурсивно процедуру добавления с параметрами 
      // ToTree=node - только что созданный объект дерева, тоесть к нему бем искать предков
      // ToId=nodes[i].id - будем искать объекты, у которых родитель текущий объект
      AddNode(node,nodes[i].id);
    end;
  end;
end;
 
 
 
procedure TForm1.Button1Click(Sender: TObject);
var i:cardinal;
begin
  TreeView1.Items.Clear;
  // Вначале считаем количество записей
    NodesCount:=ADOQuery1.RecordCount;
  // Задаем размер динамического массива для базы
  setlength(Nodes,NodesCount+1);
  // Загружаем базу в память
  ADOQuery1.First;
  for i:=1 to NodesCount do
  begin
    //Заносим в дерево код услуги, наименование и ссылку на родителя
    Nodes[i].id:=ADOQuery1.FieldValues['Group1'];
    Nodes[i].str:=ADOQuery1.FieldValues['Name'];
    try
    Nodes[i].parent_id:=ADOQuery1.FieldValues['Group2'];
    except
    end;
    ADOQuery1.Next;
  end;
  // Теперь строим дерево
  // Запускаем рекурсивную процедуру с параметром типа:
  // Добавляем в корень (nil) все значения, у которых родитель = 0
  AddNode(nil,0);
  treeview1.Items.CustomSort(nil,0,true);
end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.02.2011, 08:30
Ответы с готовыми решениями:

Treeview получение индекса выделенного элемента
Имеется такое дерево, мне необходимо, допустим, выбрать из контента все сумки, 1ый узел. Для этого мне надо знать индекс 2 узла...

Изменение цвета выделенного элемента в TreeView по нажатию кнопки
Подскажите, пожалуйста, как, по нажатию на кнопку, изменить цвет выделенного элемента в TreeView, если это возможно

Treeview считывание выделенного элемента
IntToStr(Integer(TV.Selected.Data)) вот эта строка выдает только значение последней цифры, то есть у меня id прописаны 22 24 56 43 74 25 ,...

24
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 10:37
Допустим ключ типа GUID:
При добавлении используем свойство Data у узла
Delphi
1
2
3
4
5
6
7
8
9
    // в g - значение ключа
var 
  p:PGUID;
  tn:ttreenode;
...
    p := AllocMem(sizeOf(TGuid));
    p^ := g;
    tn := tree.Items.AddChild(parent,' имя узла');
    tn.Data := p;
извлекаем данные в событии на клик по узлу
Delphi
1
2
3
var g:TGUID;
...
g := TGuid(Tree.Selected.Data^))
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 10:46  [ТС]
_victor, а tn:ttreenode; для чего?
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 10:49
th:TTreeNode - Переменная для доступа к свойствам добавленного узла, так иногда удобней работать
1
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 10:57  [ТС]
_victor, попробую разобраться))

Добавлено через 6 минут
ругается на parent, в 9-й строке примера...

p.s. что за "Имя узла" ?
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 11:02
Извини, забыл самое главное, при удалении узла осообождай выделенную память

Delphi
1
2
3
4
5
6
 procedure TreeDeletion(Sender: TObject;
  Node: TTreeNode);
begin
   FreeMem(node.Data, sizeOf(TGuid));
 
end;
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 11:04  [ТС]
_victor, удалять не потребуется... т.е. само дерево составляется в БД, а в проге только отображается...

не совсем понял, как вот эта строчка работает:

tn := tree.Items.AddChild(parent,' имя узла');
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 11:05
DenProx, в исходнике описал все схематично, так как Делфи сейчас нет под рукой
parent - родительский узел, в который добавляется новый,
ну а 'имя узла' - строчка которую записываешь в строчку дерева.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 11:09  [ТС]
_victor, т.е. вместо Parent и Имя узла, мне нужно что то свое написать?
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 11:09
Сейчас переделаю в твоем исходнике чтобы было понятней =)

а освобождать память все равно нужно, если уж выделил.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 11:10  [ТС]
Цитата Сообщение от _victor Посмотреть сообщение
а освобождать память все равно нужно, если уж выделил.
учту на будущее))
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 11:18
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
procedure TForm1.AddNode(ToTree:TTreeNode;ToId:cardinal);
var i:cardinal;
    node:TTreeNode;
    p:^cardinal; // указатель на тип cardinal
begin
  // Проверяем каждую запись в базе
  for i:=1 to NodesCount do
  begin
    // Если родитель равен коду записи, то мы добавляем ее в дерево к этому родителю 
      if nodes[i].parent_id=ToId then
    begin
      // Добавляем запись в дерево
      node:=TreeView1.Items.AddChild(ToTree,nodes[i].str);
      p := AllocMem(sizeOf(cardinal));
      p^ := nodes[i].id;
      node.Data := p;
      // Запускаем рекурсивно процедуру добавления с параметрами 
      // ToTree=node - только что созданный объект дерева, тоесть к нему бем искать предков
      // ToId=nodes[i].id - будем искать объекты, у которых родитель текущий объект
      AddNode(node,nodes[i].id);
    end;
  end;
end;
...
 
// получить ИД из узла дерева
var id:cardinal;
...
id := cardinal(TreeView1.Items[i].Data^);
и обязательно освобождай память при удалении узла дерева!
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 11:26  [ТС]
_victor, вот здесь

id := cardinal(TreeView1.Items[i].Data^);

ругается, пишет : Invalid Index
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 11:36
а какое значение у i на момент ошибки?
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 11:40  [ТС]
странно... значение в режиме отладки пишет: 4 781 748
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 11:56
Видимо, я опять криво написал =)
i в данном случае был счетчик цикла

типа того
Delphi
1
2
3
4
5
for i := 0 to treeveiw1.Items.Count - 1 do
begin
  id := cardinal(TreeView1.Items[i].Data^);
  ....
end;
Извини, мозг одновременно еще с другими задачами работает =) и некоторые вещи кажутся очевидными
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 12:05  [ТС]
_victor, теперь ошибок нет) но когда я вывожу значение id в Label, выводится одно только число при нажатии на любую запись... ключ показывается тот который был добавлен последним в TreeView
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 12:08
Покажи код добавления
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 12:10  [ТС]
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
procedure TForm1.AddNode(ToTree:TTreeNode;ToId:cardinal);
var i:cardinal;
    node:TTreeNode;
    p:^cardinal;
begin
  // Проверяем каждую запись в базе
  for i:=1 to NodesCount do
  begin
    // Если родитель равен коду записи, то мы добавляем ее в дерево к этому родителю
      if nodes[i].parent_id=ToId then
    begin
      // Добавляем запись в дерево
      //node:=TreeView1.Items.AddChildObject(ToTree,nodes[i].str,Pointer(nodes[i].id));
      node:=TreeView1.Items.AddChild(ToTree,nodes[i].str);
      p := AllocMem(sizeOf(cardinal));
      p^ := nodes[i].id;
      node.Data := p;
      // Запускаем рекурсивно процедуру добавления с параметрами
      // ToTree=node - только что созданный объект дерева, тоесть к нему бем искать предков
      // ToId=nodes[i].id - будем искать объекты, у которых родитель текущий объект
      AddNode(node,nodes[i].id);
    end;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var i:cardinal;
begin
  TreeView1.Items.Clear;
  // Вначале считаем количество записей
    NodesCount:=ADOQuery1.RecordCount;
  // Задаем размер динамического массива для базы
  setlength(Nodes,NodesCount+1);
  // Загружаем базу в память
  ADOQuery1.First;
  for i:=1 to NodesCount do
  begin
    //Заносим в дерево код услуги, наименование и ссылку на родителя
    Nodes[i].id:=ADOQuery1.FieldValues['Group1'];
    Nodes[i].str:=ADOQuery1.FieldValues['Name'];
    try
    Nodes[i].parent_id:=ADOQuery1.FieldValues['Group2'];
    except
    end;
    ADOQuery1.Next;
  end;
  // Теперь строим дерево
  // Запускаем рекурсивную процедуру с параметром типа:
  // Добавляем в корень (nil) все значения, у которых родитель = 0
  AddNode(nil,0);
  treeview1.Items.CustomSort(nil,0,true);
end;
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 12:30
Не могу понять, домой приду, разберусь

Одно замечание: у тебя в массиве Nodes количество элементов на 1 больше чем требуется (хотя это не критично).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.02.2011, 12:30
Помогаю со студенческими работами здесь

Сохранить/восстановить состояние treeview; избавиться от первого выделенного элемента
Добрый вечер, форумчане !)) Помогите пожалуйста с траблами, которые возникли при работе. 1) не могу понять, как работает...

Как узнать номер выделенного элемента в ListBox?
Как узнать номер выделенного элемента в ListBox?

TreeView заполнить из БД и получить ID выделенного узла
Здравствуйте! Помогите пожалуйста, не могу разобраться с treeview. Создал дерево, заполнил его =========== -"Имя компании...

Как получить номер выделенного узла из treeview
но не просто номер узла -а знаете как в select-e на php чтобы каждому символьному значению можно было сопоставить номер. это как то...

Цвет выделенного узла TreeView при потере фокуса
Здравствуйте! Интересует какой цвет устанавливается для фона выделенного узла TreeView при HideSelection = False, когда TreeView теряет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Полиглотные микросервисы на C# и .NET
ArchitectMsa 30.06.2025
Полиглотная архитектура появилась не из желания усложнить жизнь разработчикам. Она родилась из практической необходимости решать разные задачи наиболее эффективным способом. В одном из проектов. . .
Стратегии кеширования
Javaican 29.06.2025
Кеширование — это хранение часто запрашиваемых данных в быстром хранилище (обычно в памяти), чтобы не обращаться к более медленному первоисточнику. Казалось бы, все просто. Но за этой простотой. . .
Наблюдаемость приложений ASP.NET Core с OpenTelemetry, Prometheus и Grafana
ArchitectMsa 29.06.2025
Наблюдаемость (observability) – это ключевое свойство современной системы, позволяющее понимать её внутреннее состояние на основе внешних данных. Если мониторинг отвечает на вопрос "что случилось?",. . .
Четыре главных модели отношений классов в с++
russiannick 28.06.2025
Продолжаю крестовый поход против c++. ideone. com/ юзаю для проверки валидности кода. Насчитал 4 модели отношений классов: одиночный класс, равноправные классы, слейв - мастер, терминатор. . . .
Вложенные корутины в Unity
GameUnited 28.06.2025
Работа с корутинами в Unity кажется простой до тех пор, пока не начинаешь их вкладывать друг в друга. Я потратил несколько месяцев на изучение этого механизма, и до сих пор иногда ловлю себя на том,. . .
Управление Arduino на C# через последовательный порт
Wired 28.06.2025
Когда я впервые попробовал заставить Arduino общаться с моим C# приложением, казалось, что эти два мира существуют параллельно и никогда не пересекутся. Микроконтроллер упорно моргал встроенным. . .
Основы OpenGL 3.3 и Qt 6.9. Трансформированный треугольник
8Observer8 27.06.2025
Содержание блога На русском https:/ / rutube. ru/ video/ e424497dd6b7ae7e11494027c4b31a54/ https:/ / vkvideo. ru/ video-231040171_456239019 https:/ / www. youtube. com/ watch?v=mfD-ZL7wa_4
Федерация аутентификации на основе JWT-токенов с Keycloak и .NET в гетерогенных инфраструктурах
ArchitectMsa 27.06.2025
Тот самый момент, когда впервые столкнулся с проблемой интеграции десятка разрозненных систем аутентификации в одной корпоративной экосистеме. Кажый сервис жил своей жизнью - тут Basic Auth, там. . .
Гайд по современным СУБД (небесспорный)
Codd 26.06.2025
Когда я только начинал свой путь в IT как рядовой программист, база данных казалась мне чем-то простым и понятным. Ну, серьезно — это же просто место, где лежат данные, верно? Напиши SELECT * FROM. . .
Использование C# с AWS S3: Примеры с AWS SDK для .NET
stackOverflow 26.06.2025
Amazon S3 (Simple Storage Service) уже давно стал стандартом де-факто в мире облачного хранения данных. Особенно приятно, что для разработчиков . NET предусмотрен отличный SDK, который значительно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru