TTreeView/ru
│
English (en) │
español (es) │
suomi (fi) │
français (fr) │
magyar (hu) │
русский (ru) │
TTreeView является графическим элементом управления, который представляет иерархическое представление информации. Каждый элемент может иметь несколько подпунктов.
Элемент можно развернуть, чтобы показать подэлементы, если таковые существуют, и свернуть, чтобы скрыть подэлементы.
Добавление нового элемента в коде
Используйте TTreeView.Items.AddChild
или AddChildObject
.
Создание TreeView, который загружает элементы только при раскрытии узла
Чтобы добавить значок раскрытия к узлу без подпунктов, используйте:
MyNode.HasChildren := True;
Затем установите обработчик события OnExpanding
. В любом случае вы должны вернуться независимо от того, может ли быть выполнено раскрытие узла или нет; и если может, вы должны добавить подпункты к узлу. Если раскрытие узла не может быть выполнено, символ раскрытия будет автоматически удален, даже если ранее для HasChildren
было установлено значение true
.
Краткий пример использования TTreeview
Вот быстрый пример на коленке - я тестировал на Windows Lazarus 0.9.26:
Создаем новое приложение. На форму Form1 добавляем пустой treeview, button1 с заголовком "Add Child"(Добавить дочерний элемент) и button2 с надписью "Delete"(Удалить). Для событий кнопок OnClick
назначаем следующий код, компилируем и запускаем.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
s: string;
begin
//если нет узлов, создаем корневой узел с родителем nil
if TreeView1.Items.Count = 0 then
begin
Treeview1.Items.Add (nil,'Root Node');
exit;
end;
//задаем простой текст для каждого нового узла - Node1, Node2 и т.д.
i := treeview1.Items.Count;
s := 'Node ' + inttostr(i);
//добавляем новый узел в текущий выделенный узел
if TreeView1.Selected <> nil then
Treeview1.Items.AddChild(Treeview1.Selected ,s);
end;
procedure TForm1.Button2Click(Sender: TObject);
//процедура рекурсивного удаления узлов
procedure DeleteNode(Node:TTreeNode);
begin
while Node.HasChildren do
DeleteNode(node.GetLastChild);
TreeView1.Items.Delete(Node) ;
end;
begin
if TreeView1.Selected = nil then
exit;
//если выбранный узел имеет дочерние узлы, сначала запрашиваем подтверждение
if treeview1.Selected.HasChildren then
if messagedlg( 'Удалить узел и все его дочерние элементы ?',mtConfirmation, [mbYes,mbNo],0 ) <> mrYes then
exit;
DeleteNode(TreeView1.Selected);
end;
При запуске treeview пуст. Если вы нажмете кнопку "Add Child"(Добавить дочерний элемент), будет создан корневой узел. После этого дочерний элемент будет добавлен в любой выделенный узел по нажатию "Add Child"(Добавить дочерний элемент). Кнопка "Delete" удалит текущий выделенный узел. Если у него нет дочерних элементов, он удалит его сразу, если есть - сначала спросит.
Использование множественного выделения
Чтобы включить возможность выделения нескольких узлов одновременно, нужно установить флаг tvoAllowMultiSelect
в свойстве Options
. Это позволит выделять дополнительные узлы при помощи щелчка мыши с нажатой кнопкой Ctrl.
Для получения списка выделенных узлов из кода используется свойство TreeView1.Selections
:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
Memo1.Lines.Clear;
for i := 0 to TreeView1.SelectionCount - 1 do
Memo1.Lines.Add(TreeView1.Selections[i].GetTextPath);
end;
Освобождение данных TreeNode
Используйте событие TreeView OnDeletion
, чтобы освободить ваш объект.
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
TMyObject(Node.Data).Free;
Node.Data := nil;
end;
Использование механизма Drag and Drop в TreeView
Если вы хотите разрешить функцию перетаскивания в вашем treeview, вам необходимо:
- установить для свойства
Drag Mode
вашего дерева значениеDmAutomatic
- создать событие для
OnDragOver
:
procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := true;
end;
См. также