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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2012, 21:23   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Работа с Index-ами в TreeView

Добрый вечер! Разобрался сегодня как же все таки присвоить картинки созданным итемам в TreeView . Теперь мне нужно вот что.

Где-то в программе создается корневой узел так:
Код:
var
 Node: TTreeNode;
begin
    Node:=tv1.Items.Add(Nil,sLabel3.Caption);
    Node.SelectedIndex:=0;
    Node.ImageIndex:=0;
    tv1.FullExpand;
end;
все нормально создается и картинка какая надо присваивается. Далее, в программе создаются в ранее созданном корневом узле подузлы так:
Код:
var
 Node: TTreeNode;
begin
 Node:=tv1.Items.AddChild(tv1.Items.Item[0],'Новый' +
                                      IntToStr(tv1.Items.Count + 1));
 Node.SelectedIndex:=tv1.Items.Count + 1;
 Node.ImageIndex:=1;
 tv1.FullExpand;
end;
тоже все ништяк создается и присваивается.

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

У TTreeNode есть свойство Data, куда можно засунуть такой номер
Код:
var Index: Integer;
...
  Node:=TreeView1.Items.AddObject(Nil,'KKK',Pointer(Index));
  Node:=TreeView1.Items.AddChildObject(Node,'GGG',Pointer(Index));
или
  Node.Data:=Pointer(Index);
Прочитать значение можно так
Код:
  Index:=Integer(Node.Data);
Поиск нужного TreeNode по номеру путем перебора
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.03.2012, 21:57   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

т.е. так будет присвоен произвольный Index, который я могу указать, добавляемому итему?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 20.03.2012, 22:01   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
т.е. так будет присвоен произвольный Index
Ну да, любое Integer значение, если это номер, то уникальность его обеспечить не помешает. Можно и указатели на любые объекты засунуть для быстрого доступа к ним с текущего нода
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.03.2012, 08:33   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

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

Код:
procedure TForm.TreeViewChange(Sender: TObject; Node: TTreeNode);
var xNumber: Integer;
begin
  xNumber:=Integer(Node.Data); //индекс выбранного узла
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.03.2012, 09:33   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Что-то немного запутался с этими индексами. Можешь, если не трудно, скинуть пример? Я посмотрю, что и где и делаю не так.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 21.03.2012, 15:19   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Label1: TLabel;
    Button1: TButton;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var Node: TTreeNode;
begin
  {Заполнение TreeView1}
  TreeView1.HideSelection:=False;
  Node:=TreeView1.Items.AddObject(nil,'Узел 1',Pointer(1));
  TreeView1.Items.AddChildObject(Node,'Узел 1.1',Pointer(2));
  TreeView1.Items.AddChildObject(Node,'Узел 1.2',Pointer(3));
  Node:=TreeView1.Items.AddObject(nil,'Узел 2',Pointer(4));
  TreeView1.Items.AddChildObject(Node,'Узел 2.1',Pointer(5));
  TreeView1.Items.AddChildObject(Node,'Узел 2.2',Pointer(6));
  TreeView1.FullExpand;
end;

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  {Отображение номера выделенного узла в Label1}
  if Node=nil then Label1.Caption:='Not Selected'
              else Label1.Caption:=Format('Номер узла = %d',[Integer(Node.Data)]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var Value,i: Integer;
    Node: TTreeNode;
begin
  {Поиск узла по номеру заданному Edit1}
  if not TryStrToInt(Edit1.Text,Value) then Label1.Caption:='Введите целое число'
  else begin
    Node:=nil;
    for i:=0 to TreeView1.Items.Count-1 do
      if Integer(TreeView1.Items.Item[i].Data)=Value then begin
        Node:=TreeView1.Items.Item[i];
        Break;
      end;
    if Node=nil then Label1.Caption:='Узел не найден'
                else TreeView1.Selected:=Node;
  end;
end;

end.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с TreeView DENIS_1992 Общие вопросы Delphi 7 09.06.2011 00:37
работа с treeview patrontas Общие вопросы Delphi 0 19.05.2011 13:17
Работа с TreeView Demien Общие вопросы Delphi 3 02.07.2009 16:57
работа с Hint-ами nusik Общие вопросы Delphi 7 01.06.2009 11:26