Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Копировать нижние узлы TTreeView во второй TTreeView

Delphi , Компоненты и Классы , TTreeView

Копировать нижние узлы TTreeView во второй TTreeView

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

type
   {: Callback to use to copy the data of a treenode when the 
     node itself is copied by CopySubtree. 
   @param oldnode is the old node 
   @param newnode is the new node 
   @Desc Use a callback of this type to implement your own algorithm 
     for a node copy. The default just uses the Assign method, which 
     produces a shallow copy of the nodes Data property. }
   TCopyDataProc = procedure(oldnode, newnode : TTreenode);

 {: The default operation is to do a shallow copy of the node, via 
Assign. }
 procedure DefaultCopyDataProc(oldnode, newnode : TTreenode);
 begin
   newnode.Assign(oldnode);
 end;

 {-- CopySubtree 
-------------------------------------------------------}
 {: Copies the source node with all child nodes to the target treeview. 
@Param sourcenode is the node to copy 
@Param target is the treeview to insert the copied nodes into 
@Param targetnode is the node to insert the copy under, can be nil to 
  make the copy a top-level node. 
@Param CopyProc is the (optional) callback to use to copy a node. 
  If Nil is passed for this parameter theDefaultCopyDataProc will be 
used. 
@Precondition  sourcenode <> nil, target <> nil, targetnode is either 
  nil or a node of target 
@Raises Exception if targetnode happens to be in the subtree rooted in 
  sourcenode. Handling that special case is rather complicated, so we 
  simply refuse to do it at the moment. 
}{ Created 2003-04-09 by P. Below ----------------------------------------------------------------------- 
}
 procedure CopySubtree(sourcenode : TTreenode; target : TTreeview;
   targetnode : TTreenode; CopyProc : TCopyDataProc = nil);
 var
   anchor : TTreenode;
   child : TTreenode;
 begin { CopySubtree }
   Assert(Assigned(sourcenode),
     'CopySubtree:sourcenode cannot be nil');
   Assert(Assigned(target),
     'CopySubtree: target treeview cannot be nil');
   Assert((targetnode = nil) or (targetnode.TreeView = target),
     'CopySubtree: targetnode has to be a node in the target treeview.');

   if (sourcenode.TreeView = target) and
     (targetnode.HasAsParent(sourcenode) or (sourcenode =
     targetnode)) then
     raise Exception.Create('CopySubtree cannot copy a subtree to one of the ' +
       'subtrees nodes.');

   if not Assigned(CopyProc) then
     CopyProc := DefaultCopyDataProc;

   anchor := target.Items.AddChild(targetnode, sourcenode.Text);
   CopyProc(sourcenode, anchor);
   child := sourcenode.GetFirstChild;
   while Assigned(child) do
    begin
     CopySubtree(child, target, anchor, CopyProc);
     child := child.getNextSibling;
   end; { While }
 end; { CopySubtree }


 procedure TForm1.Button1Click(Sender : TObject);
 begin
   if assigned(treeview1.selected) then
     CopySubtree(treeview1.selected, treeview2, nil);
 end;

Перевод контента на русский язык:

Приведенный код - часть программы Delphi, которая реализует метод копирования узлов из одного компонента TTreeView (имени treeview1) в другой (treeview2). Копирующий процесс涉гает рекурсивное обход дерева источника и добавление эквивалентных узлов в целевое дерево.

Разбивка кода:

  1. TCopyDataProc - тип для callback-процедуры, используемой для копирования данных из старого узла в новый.
  2. DefaultCopyDataProc - стандартное реализация TCopyDataProc. Она использует метод Assign для поверхностного копирования свойства Data старого узла в новый.
  3. CopySubtree - основная процедура, выполняющая копирование. Она принимает четыре параметра:
    • sourcenode: узел источника, из которого будет копироваться.
    • target: компонент TTreeView, где будут добавлены скопированные узлы.
    • targetnode: родительский узел в целевом дереве, в котором будет вставлен скопированный поддерево (или nil, если желается вставка на верхнем уровне).
    • CopyProc: необязательная callback-процедура, которая может быть использована для.customization копирующего процесса. Если не предоставляется, используется стандартное реализация (DefaultCopyDataProc).
  4. Событийный обработчик кнопки Button1Click в коде формы вызывает процедуру CopySubtree с выбранным узлом из treeview1 как источником и treeview2 как целевым деревом.

Некоторые улучшения и предложения:

  • В процедуре CopySubtree можно упростить проверки утверждений, используя одну строку кода: Assert( sourcenode in target.Items.Children, 'Invalid source node');
  • Может быть полезно добавить более полное обслуживание ошибок для случаев, когда источник или целевой узлы являются недопустимыми.
  • Если планируется использовать этот код в многопоточной среде, необходимо обеспечить безопасность компонентов treeview и их узлов от потоков.
  • Процедура CopySubtree предполагает, что источник имеет детей. Может быть полезно добавить проверку на это перед попыткой копирования поддерева.
  • Рекомендуется добавить механизм для сохранения оригинального положения узла в целевом дереве (например, путем записи индекса узла и последующего переупорядочивания узлов).

Копирование нижних узлов TTreeView в второй TTreeView: описывается процедура CopySubtree, которая копирует выбранный узел из первого дерева и вставляет его в второе дерево.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TTreeView ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 09:04:01/0.0060210227966309/0