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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2011, 14:45   #1
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию TreeView - узнать ключ выделенного элемента

Доброго времени суток. У меня такой вопросик: как узнать ключ выделенного элемента в TreeView ... При условии что сам TreeView заполняется из БД... и нужно узнать ключ именно из неё...
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 10.02.2011, 15:34   #2
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

А вы этот самый ключ заносите в TreeNode.Data в процессе "TreeView заполняется из БД" ?
Если нет, то выход один - Locate по Selected.Text... но без гарантии, если есть совпадающие значения.
asmodey1 вне форума Ответить с цитированием
Старый 11.02.2011, 07:34   #3
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

asmodey1 а как нужно заносить ключ в TreeNode.Data ?

p.s. повторения имеются... точнее предпологается что они будут

если это как то поможет, вот код который заполняет TV из БД:

Код:
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;
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле

Последний раз редактировалось DenProx; 11.02.2011 в 07:54.
DenProx вне форума Ответить с цитированием
Старый 11.02.2011, 13:56   #4
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

Сделал изменения в коде... но проблема теперь в том, что ключ показывается только от последней надписи в TreeView ... т.е. та которая при построении дерева находится самой последней (не путать с последней добавленной в БД)... код такой:

Код:
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;

procedure TForm1.TreeView1Click(Sender: TObject);
var i, id:cardinal;
begin
// Выводим ключ выделенного узла в Label
 for i := 0 to TreeView1.Items.Count - 1 do
begin
  id := cardinal(TreeView1.Items[i].Data^);
end;
Label1.Caption := IntToStr(id);
end;
Что тут может быть не так?
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 12.02.2011, 10:34   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
procedure TForm1.TreeView1Click(Sender: TObject);
var i, id:cardinal;
begin
// Выводим ключ выделенного узла в Label
i:=TreeView1.ItemIndex;
if i>=0 then begin
id:=cardinal(TreeView1.Items[i].Data^);
Label1.Caption := IntToStr(id);
end
else Label1.Caption := 'текущий узел  не выбран';
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.02.2011, 14:09   #6
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Можно еще Selected использовать:
Код:
if TreeView1.Selected=nil then
Label1.Caption := 'Ничего не выбрано';
Это тот же TreeView1.Items[i]...
asmodey1 вне форума Ответить с цитированием
Старый 14.02.2011, 09:06   #7
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

у меня почему то пишет что ItemIndex не объявленная переменная... может модуля какого не хватает в Uses ?
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 14.02.2011, 12:56   #8
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

все оказалось проще... нужно вот так:

Код:
// Выводим ключ выделенного узла в Label
  if TreeView1.Selected = nil then
    exit;
  Label1.Caption := inttostr(integer(TreeView1.Selected.Data^));
и все работает) Всем спасибо!)
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление выделенного элемента mar4elo PHP 3 22.07.2010 22:32
treeview переименование элемента alco84 Microsoft Office Access 4 20.04.2010 13:28
TreeView - пройтись по всем узлам, начиная с выделенного Alter Компоненты Delphi 14 15.01.2009 22:52
Выделение элемента в TreeView pu4koff Общие вопросы .NET 2 06.10.2008 13:07