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

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток. У меня такой вопросик: как узнать ключ выделенного элемента в 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2011, 08:30
Ответы с готовыми решениями:

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

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

Treeview считывание выделенного элемента
IntToStr(Integer(TV.Selected.Data)) вот эта строка выдает только значение последней цифры, то есть...

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

24
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 10:37 2
Допустим ключ типа 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
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 10:46  [ТС] 3
_victor, а tn:ttreenode; для чего?
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 10:49 4
th:TTreeNode - Переменная для доступа к свойствам добавленного узла, так иногда удобней работать
1
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 10:57  [ТС] 5
_victor, попробую разобраться))

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

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

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

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

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

а освобождать память все равно нужно, если уж выделил.
0
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 11:10  [ТС] 11
Цитата Сообщение от _victor Посмотреть сообщение
а освобождать память все равно нужно, если уж выделил.
учту на будущее))
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 11:18 12
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
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 11:26  [ТС] 13
_victor, вот здесь

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

ругается, пишет : Invalid Index
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 11:36 14
а какое значение у i на момент ошибки?
0
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 11:40  [ТС] 15
странно... значение в режиме отладки пишет: 4 781 748
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 11:56 16
Видимо, я опять криво написал =)
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
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 12:05  [ТС] 17
_victor, теперь ошибок нет) но когда я вывожу значение id в Label, выводится одно только число при нажатии на любую запись... ключ показывается тот который был добавлен последним в TreeView
0
116 / 58 / 6
Регистрация: 16.12.2009
Сообщений: 204
11.02.2011, 12:08 18
Покажи код добавления
0
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.02.2011, 12:10  [ТС] 19
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 20
Не могу понять, домой приду, разберусь

Одно замечание: у тебя в массиве Nodes количество элементов на 1 больше чем требуется (хотя это не критично).
1
11.02.2011, 12:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2011, 12:30
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru