Урок 18 - Знакомство с компонентами (часть 9/12)

  В этом уроке мы продолжаем изучать вкладку Win32.
  В этот раз мы будем рассматривать компонент под названием TreeView. Мы научимся добавлять, удалять, изменять и сортировать.

   Этот компонент предназначен для отображения сложной иерархической структуры данных. Например в левой области проводника Windows используется этот компонент для быстрой навигации по папкам.

   И так перейдём к делу, на понадобятся компоненты: 1 TTreeView, 4 TButton, 1 TLabel и TEdit. У первой Caption давайте сделаем "Добавить", у второй "Удалить", третьей "Добавить потомка" и для четвертой "Изменить". Разместите все компоненты вот так:

Расположение компонентов


   Как и у ListView, у этого компонента есть собственный редактор строк. Вызовем его кликнув по свойству Items в Object Inspetor. Появилось вот такое окно:

TreeView Items Editor


   Оно похоже на то, что использовалось в ListView, за исключением лишь одной функции, TreeView обладает функцией загрузки/сохранения текущей информации и соответственно добавилась одна кнопка "Load". Добавляем новый Item и Text у него "Программы", добавим еще один с текстом "Игры", и "Картинки", в последний добавим потомка, клик по "New SubItem" с текстом "Фото". Скомпилируем и посмотрим что получилось. Нажав на плюсик находящийся перед "Картинки", разворачивается список и в нем наш потомок, а "Картинки" это родитель.

TreeView


   Теперь приступим к добавлению строк. Как и в прошлом уроке нам понадобится текущий выделенный Item. Создадим 2 глобальных переменных t:integer и MyNode:TTreesNode ну и обработчик события TreeView, OnChange:
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
MyNode:=Node;
t:=Node.AbsoluteIndex;
Label1.Caption:= IntToStr(t);
end;
   Проверим... Обратите внимание, казалось бы потомок должен иметь индекс 2.1, но это не так, в TreeView в каком порядке развернуты потомки такие они имеют индексы, то есть в нашем случае потомок "Фото" имеет индекс 3. MyNode здесь нужна для того чтоб узнать какой родительский Item сейчас выделен.

   Ну а теперь можно и добавить. Вытащим TEdit, чтоб можно было задавать имя нового элемента.

   Создадим обработчик события Button1, OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.Add(MyNode, Edit1.Text);
end;
   Ну и сразу же добавим потомка. Создадим обработчик события Button2, OnClick:
procedure TForm1.Button2Click(Sender: TObject);
begin
TreeView1.Items.AddChild(MyNode, Edit1.Text);
end;
   Научимся удалять. Создадим обработчик события Button3, OnClick:
procedure TForm1.Button3Click(Sender: TObject);
begin
TreeView1.Items.Item[t].Delete;
end;
   Изменим элемент. Создадим обработчик события Button4, OnClick:
procedure TForm1.Butto4Click(Sender: TObject);
begin
TreeView1.Items.Item[t].Text:=Edit1.Text;
end;
   Теперь мы можем полноценно редактировать содержимое компонента, но не хватает сортировки. Сортировка управляется свойством SortType, установим сортировку по алфавиту: stText

   Ну вот и все, вот что у нас получилось:

Результат


   В следующем уроке мы начнём изучение компонентов с вкладки System, первым компонентом будет TTimer.

Удачи!
Встретимся в следующем уроке!




Добавил(а): pukkup74 Дата: 2013-11-01
Не TTreesNode,а TTreeNode



Добавил(а): _Bes_ Дата: 2014-03-13
Здесь начиная с первой кнопки компилятор не пропускает. procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode); var t:Integer; MyNode:TTreeNode; begin MyNode:=Node; t:=Node.AbsoluteIndex; Label1.Caption:=IntToStr(t); end; procedure TForm1.Button1Click(Sender: TObject); var t:Integer; MyNode:TTreeNode; begin MyNode:=Node; t:=Node.AbsoluteIndex; TreeView1.Items.Add(MyNode, Edit1.Text); end; procedure TForm1.Button3Click(Sender: TObject); var t:Integer; MyNode:TTreeNode; begin MyNode:=Node; t:=Node.AbsoluteIndex; TreeView1.Items.AddChild(MyNode, Edit1.Text); end; procedure TForm1.Button2Click(Sender: TObject); var t:Integer; MyNode:TTreeNode; begin MyNode:=Node; t:=Node.AbsoluteIndex; TreeView1.Items.Item[t].Delete; end; procedure TForm1.Button4Click(Sender: TObject); var t:Integer; MyNode:TTreeNode; begin MyNode:=Node; t:=Node.AbsoluteIndex; TreeView1.Items.Item[t].Text:=Edit1.Text; end; end. ужу всё перепробовал!!!



Добавил(а): [email protected] Дата: 2015-04-25



Добавил(а): evgen_2017 Дата: 2017-10-26
Добавил(а): _Bes_ [Новичок] Дата: 2014-03-13 Здесь начиная с первой кнопки компилятор не пропускает. procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode); var t:Integer; MyNode:TTreeNode; begin MyNode:=Node; t:=Node.AbsoluteIndex; Label1.Caption:=IntToStr(t); end; procedure TForm1.Button1Click(Sender: TObject); var t:Integer; MyNode:TTreeNode; begin MyNode:=Node; t:=Node.AbsoluteIndex; TreeView1.Items.Add(MyNode, Edit1.Text); end; procedure TForm1.Button3Click(Sender: TObject); var t:Integer; MyNode:TTreeNode; begin MyNode:=Node; t:=Node.AbsoluteIndex; TreeView1.Items.AddChild(MyNode, Edit1.Text); end; procedure TForm1.Button2Click(Sender: TObject); var t:Integer; MyNode:TTreeNode; begin MyNode:=Node; t:=Node.AbsoluteIndex; TreeView1.Items.Item[t].Delete; end; procedure TForm1.Button4Click(Sender: TObject); var t:Integer; MyNode:TTreeNode; begin MyNode:=Node; t:=Node.AbsoluteIndex; TreeView1.Items.Item[t].Text:=Edit1.Text; end; end. ужу всё перепробовал!!! Зачем ты в каждой процедуре обьявляешь t:integer mynode:treenode. если ты обьявил уже их там где глобальные переменные,в шапке кода? и на кой хер ты присваиваешь в каждой процедуре им значения? просто делай всё так как написано в уроке,все получится.


  1. алекс
    алекс a year ago
    Добрый. У меня все время в родительские добавляет. Потом ни как не добавляется. Последние процедуры все в точности. мне кажется дело в процедуре потомка, но понять не могу что там изменить, вроде все норм.
  2. neon
    neon 9 months ago
    Полезная статья, спс.
    TreeView актуален еще и потому, что до сегодняшнего времени в палитре компонентов Delphi так и не появилось версии TreeView, но ориентированного на Базы Данных.
    В этой части может быть полезен материал статьи: "Delphi. SQLite. FireDac. Обвязка для TreeView".
    См. здесь https://roamer55.ru/main_programming/delphi/delphi_10_2_vcl/d10_funcs_db/d10_funcs_db_sqlite/d10_funcs_db_sqlite_tree_01/
Отменить.