Урок 18 - Знакомство с компонентами (часть 9/12)
В этом уроке мы продолжаем изучать вкладку Win32.
В этот раз мы будем рассматривать компонент под названием TreeView. Мы научимся добавлять, удалять, изменять и сортировать.
Этот компонент предназначен для отображения сложной иерархической структуры данных. Например в левой области проводника Windows используется этот компонент для быстрой навигации по папкам.
И так перейдём к делу, на понадобятся компоненты: 1 TTreeView, 4 TButton, 1 TLabel и TEdit. У первой Caption давайте сделаем "Добавить", у второй "Удалить",
третьей "Добавить потомка" и для четвертой "Изменить". Разместите все компоненты вот так:
Как и у ListView, у этого компонента есть собственный редактор строк. Вызовем его кликнув по свойству Items в Object Inspetor. Появилось вот такое окно:
Оно похоже на то, что использовалось в ListView, за исключением лишь одной функции, TreeView обладает функцией загрузки/сохранения текущей информации и соответственно добавилась одна кнопка "Load". Добавляем новый Item и Text у него "Программы", добавим еще один с текстом "Игры", и "Картинки", в последний добавим потомка, клик по "New SubItem" с текстом "Фото". Скомпилируем и посмотрим что получилось. Нажав на плюсик находящийся перед "Картинки", разворачивается список и в нем наш потомок, а "Картинки" это родитель.
Теперь приступим к добавлению строк. Как и в прошлом уроке нам понадобится текущий выделенный 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. ужу всё перепробовал!!!
|
Добавил(а): 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. если ты обьявил уже их там где глобальные переменные,в шапке кода? и на кой хер ты присваиваешь в каждой процедуре им значения? просто делай всё так как написано в уроке,все получится.
|
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/