Difference between revisions of "TTreeView/ru"
Line 96: | Line 96: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == | + | == Использование мезанизма Drag and Drop в TreeView == |
If you want to allow a drag and drop function in your treeview, you need to : | If you want to allow a drag and drop function in your treeview, you need to : | ||
# Set to DmAutomatic, the property "Drag Mode" of your treeview | # Set to DmAutomatic, the property "Drag Mode" of your treeview | ||
# Create an event for "OndragOver": | # Create an event for "OndragOver": | ||
+ | |||
+ | Если вы хотите разрешить функцию перетаскивания в вашем treeview, вам необходимо: | ||
+ | # установить для свойства <code>[https://lazarus-ccr.sourceforge.io/docs/lcl/controls/tcontrol.dragmode.html Drag Mode]</code> вашего дерева значение <code>[https://lazarus-ccr.sourceforge.io/docs/lcl/controls/tdragmode.html DmAutomatic]</code> | ||
+ | # создать событие для <code>[https://lazarus-ccr.sourceforge.io/docs/lcl/controls/tcontrol.ondragdrop.html OnDragOver]<code>: | ||
<syntaxhighlight lang=pascal>procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); | <syntaxhighlight lang=pascal>procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); |
Revision as of 12:33, 21 June 2020
│
English (en) │
español (es) │
suomi (fi) │
français (fr) │
magyar (hu) │
русский (ru) │
TTreeView является графическим элементом управления, который представляет иерархическое представление информации. Каждый элемент может иметь несколько подпунктов.
Элемент можно развернуть, чтобы показать подэлементы, если таковые существуют, и свернуть, чтобы скрыть подэлементы.
Добавление нового элемента в коде
Используйте TTreeView.Items.AddChild
или AddChildObject
.
Создание TreeView, который загружает элементы только при раскрытии узла
Чтобы добавить значок раскрытия к узлу без подпунктов, используйте:
MyNode.HasChildren := True;
And then set an event handler for the OnExpanding event. In this even you should return if the expansion can actually be made or not and when yes, you should add subitems to the node. If the expansion cannot be done, the expansion symbol will be automatically removed even if you have previously set HasChildren to 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" удалит текущий выделенный узел. Если у него нет дочерних элементов, он удалит его сразу, если есть - сначала спросит.
Пример использования выбора нескольких узлов для выбора нескольких пользователей
Если вы выберете свой компонент TTreeview, перейдите к инспектору объектов и в разделах параметров установите для 'tvoAllowMultiSelect' значение <ode>true. Затем, чтобы выполнить перебор в цикле выбранных узлов и получить пути к выбранным папкам или файлам, в следующем примере текстовые пути этих выбранных узлов будут сохранены в виде строк memo.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
if TreeView1.SelectionCount=0 then
exit;
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
If you want to allow a drag and drop function in your treeview, you need to :
- Set to DmAutomatic, the property "Drag Mode" of your treeview
- Create an event for "OndragOver":
Если вы хотите разрешить функцию перетаскивания в вашем treeview, вам необходимо:
- установить для свойства
Drag Mode
вашего дерева значениеDmAutomatic
- создать событие для
OnDragOver
:
procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := true;
end;
See also