Sign in Join
Wiki copytemporary

TTreeView/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: TTreeView/ru

OldNewLine
1+[**TTreeView**](https://lazarus-ccr.sourceforge.io/docs/lcl/comctrls/ttreeview.html) ![](/wiki-images/a/a3/Ttreeview.png) является графическим элементом управления, который представляет иерархическое представление информации. Каждый элемент может иметь несколько подпунктов.
2+
3+Элемент можно развернуть, чтобы показать подэлементы, если таковые существуют, и свернуть, чтобы скрыть подэлементы.
4+
5+## Добавление нового элемента в коде
6+
7+Используйте [`TTreeView.Items.AddChild`](https://lazarus-ccr.sourceforge.io/docs/lcl/comctrls/ttreenodes.addchild.html) или [`AddChildObject`](https://lazarus-ccr.sourceforge.io/docs/lcl/comctrls/ttreenodes.addchildobject.html).
8+
9+## Создание TreeView, который загружает элементы только при раскрытии узла
10+
11+Чтобы добавить значок раскрытия к узлу без подпунктов, используйте:
12+
13+``` pascal
14+MyNode.HasChildren := True;
15+```
16+
17+Затем установите обработчик события [`OnExpanding`](https://lazarus-ccr.sourceforge.io/docs/lcl/comctrls/tcustomtreeview.onexpanding.html). В любом случае вы должны вернуться независимо от того, может ли быть выполнено раскрытие узла или нет; и если может, вы должны добавить подпункты к узлу. Если раскрытие узла не может быть выполнено, символ раскрытия будет автоматически удален, даже если ранее для [`HasChildren`](https://lazarus-ccr.sourceforge.io/docs/lcl/comctrls/ttreenode.haschildren.html) было установлено значение `true`.
18+
19+## Краткий пример использования TTreeview
20+
21+Вот быстрый пример на коленке - я тестировал на Windows Lazarus 0.9.26:
22+
23+Создаем новое приложение. На форму Form1 добавляем пустой treeview, button1 с заголовком "Add Child"(Добавить дочерний элемент) и button2 с надписью "Delete"(Удалить). Для событий кнопок `OnClick` назначаем следующий код, компилируем и запускаем.
24+
25+Код:
26+
27+``` pascal
28+procedure TForm1.Button1Click(Sender: TObject);
29+var
30+ i: integer;
31+ s: string;
32+begin
33+ //если нет узлов, создаем корневой узел с родителем nil
34+ if TreeView1.Items.Count = 0 then
35+ begin
36+ Treeview1.Items.Add (nil,'Root Node');
37+ exit;
38+ end;
39+
40+ //задаем простой текст для каждого нового узла - Node1, Node2 и т.д.
41+ i := treeview1.Items.Count;
42+ s := 'Node ' + inttostr(i);
43+ //добавляем новый узел в текущий выделенный узел
44+ if TreeView1.Selected <> nil then
45+ Treeview1.Items.AddChild(Treeview1.Selected ,s);
46+end;
47+
48+procedure TForm1.Button2Click(Sender: TObject);
49+
50+ //процедура рекурсивного удаления узлов
51+ procedure DeleteNode(Node:TTreeNode);
52+ begin
53+ while Node.HasChildren do
54+ DeleteNode(node.GetLastChild);
55+ TreeView1.Items.Delete(Node) ;
56+ end;
57+
58+begin
59+ if TreeView1.Selected = nil then
60+ exit;
61+
62+ //если выбранный узел имеет дочерние узлы, сначала запрашиваем подтверждение
63+ if treeview1.Selected.HasChildren then
64+ if messagedlg( 'Удалить узел и все его дочерние элементы ?',mtConfirmation, [mbYes,mbNo],0 ) <> mrYes then
65+ exit;
66+ DeleteNode(TreeView1.Selected);
67+end;
68+```
69+
70+При запуске treeview пуст. Если вы нажмете кнопку "Add Child"(Добавить дочерний элемент), будет создан корневой узел. После этого дочерний элемент будет добавлен в любой выделенный узел по нажатию "Add Child"(Добавить дочерний элемент). Кнопка "Delete" удалит текущий выделенный узел. Если у него нет дочерних элементов, он удалит его сразу, если есть - сначала спросит.
71+
72+## Использование множественного выделения
73+
74+Чтобы включить возможность выделения нескольких узлов одновременно, нужно установить флаг `tvoAllowMultiSelect` в свойстве `Options`. Это позволит выделять дополнительные узлы при помощи щелчка мыши с нажатой кнопкой `Ctrl`.
75+
76+Для получения списка выделенных узлов из кода используется свойство `TreeView1.Selections`:
77+
78+``` pascal
79+procedure TForm1.Button1Click(Sender: TObject);
80+var
81+ i: integer;
82+begin
83+ Memo1.Lines.Clear;
84+ for i := 0 to TreeView1.SelectionCount - 1 do
85+ Memo1.Lines.Add(TreeView1.Selections[i].GetTextPath);
86+end;
87+```
88+
89+## Освобождение данных TreeNode
90+
91+Используйте событие TreeView [`OnDeletion`](https://lazarus-ccr.sourceforge.io/docs/lcl/comctrls/tcustomtreeview.ondeletion.html), чтобы освободить ваш объект.
92+
93+``` pascal
94+procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
95+begin
96+ TMyObject(Node.Data).Free;
97+ Node.Data := nil;
98+end;
99+```
100+
101+## Использование механизма Drag and Drop в TreeView
102+
103+Если вы хотите разрешить функцию перетаскивания в вашем treeview, вам необходимо:
104+
105+1. установить для свойства [`Drag Mode`](https://lazarus-ccr.sourceforge.io/docs/lcl/controls/tcontrol.dragmode.html) вашего дерева значение [`DmAutomatic`](https://lazarus-ccr.sourceforge.io/docs/lcl/controls/tdragmode.html)
106+2. создать событие для [`OnDragOver`](https://lazarus-ccr.sourceforge.io/docs/lcl/controls/tcontrol.ondragdrop.html):
107+
108+``` pascal
109+procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
110+begin
111+ Accept := true;
112+end;
113+```
114+
115+## См. также
116+
117+- [[doc:/lcl/comctrls/ttreeview.html|TTreeView doc]]
118+- [[TListView]]
119+
120+---
121+*From the Free Pascal wiki, page "TTreeView/ru", as it stood on 2024-02-24 after a change by N7800, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history