Копия викизеркало

Это зеркало вики с pascal.chat. Правка, история и вход — там.

TTreeView/ru

English · Español · Français · Magyar · Suomi · Русский

TTreeView является графическим элементом управления, который представляет иерархическое представление информации. Каждый элемент может иметь несколько подпунктов.

Элемент можно развернуть, чтобы показать подэлементы, если таковые существуют, и свернуть, чтобы скрыть подэлементы.

Добавление нового элемента в коде

Используйте TTreeView.Items.AddChild или AddChildObject.

Создание TreeView, который загружает элементы только при раскрытии узла

Чтобы добавить значок раскрытия к узлу без подпунктов, используйте:

pascal
MyNode.HasChildren := True;

Затем установите обработчик события OnExpanding. В любом случае вы должны вернуться независимо от того, может ли быть выполнено раскрытие узла или нет; и если может, вы должны добавить подпункты к узлу. Если раскрытие узла не может быть выполнено, символ раскрытия будет автоматически удален, даже если ранее для HasChildren было установлено значение true.

Краткий пример использования TTreeview

Вот быстрый пример на коленке - я тестировал на Windows Lazarus 0.9.26:

Создаем новое приложение. На форму Form1 добавляем пустой treeview, button1 с заголовком "Add Child"(Добавить дочерний элемент) и button2 с надписью "Delete"(Удалить). Для событий кнопок OnClick назначаем следующий код, компилируем и запускаем.

Код:

pascal
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:

pascal
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, чтобы освободить ваш объект.

pascal
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
  TMyObject(Node.Data).Free;
  Node.Data := nil;
end;

Использование механизма Drag and Drop в TreeView

Если вы хотите разрешить функцию перетаскивания в вашем treeview, вам необходимо:

  1. установить для свойства Drag Mode вашего дерева значение DmAutomatic
  2. создать событие для OnDragOver:
pascal
procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;  State: TDragState; var Accept: Boolean);
begin
  Accept := true;
end;

См. также


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.

Версия 1, последнее изменение: WikiArchive, .