Delphi最好的免费第三方树实现是什么?

Jef*_*eff 5 delphi tree virtualtreeview

我需要一个可以与Virtual Treeview一起使用的树实现,它不会消耗太多内存,易于使用,并且与VT一样快(也就是说,当我将数据存储在VT本身时)

我尝试过Linas的svTree - 它易于使用,但不如我希望的那么快和内存友好.

此外,只想指出我的应用程序将管理数千个节点.:)

你推荐什么免费图书馆?您是否能够构建一个如何在Virtual Treeview中使用它的最小演示?

Mar*_*orf 3

查看rmControlsrmTreeNonView库中的组件。

多年来我们一直使用该树的修改版本作为数据容器。它是免费、快速、非可视化的,附带源代码,并且很容易上手,因为几乎 100% 重复 TTreeView 的方法和属性,并且添加了一些自己的方法 - 特别是基于哈希的快速树搜索节点路径。

我怀疑该公司是否已停止营业(http://www.mills-enterprise.ca),但 rmControls 包(包括源代码)可在许多 Delphi 下载站点上找到。

编辑:

这里有一些代码展示了如何从 VTV 的节点指向另一个树结构中的节点...希望我已经包含了足够的代码来让您了解发生了什么。TmwDataTreeNode 是 TTreeNonView 后代的节点。请注意,当 PopulateVT 方法完成时,每个 TNodeData 的 ContextNode 字段都指向源数据容器树中的一个节点。请注意,此方法利用 VTV 的虚拟特性,这可能更适合您的情况。

type
      //Virtual tree record stuff
  PNodeData = ^TNodeData;
  TNodeData = record
  public
    NodeSelf: PVirtualNode;         //Ptr to our own VT node...needed?
    ContextNode: TmwDataTreeNode;        //ptr to our corresp node of data tree
    GridRecordIndex: integer;      //Grid.RecordIndex of our corresp Alloc formula.
  end;


procedure T_fmExplAllocOut.PopulateVT;
{ Load data to the DragDrop treeview. }
var
  n: TmwDataTreeNode;        //Pointer to a node of my customized TTreeNonView
begin
  VT.NodeDataSize := SizeOf(TNodeData);
  VT.BeginUpdate;
  vtsChangeFontSize(VT, Self.Font.Size);     //Set Tree Font.Size & DefaultNodeHeight
      //Add DragDrop Tree nodes
  n := AllocController.SnapContext.Tree.Items.GetFirstNode;
  while n <> nil do begin
    AddVTNode(nil, n);              //nil=parent node of top-level VT nodes
    n := n.GetNextSibling;
  end;
  VT.FullExpand;
  VT.EndUpdate;
end;


procedure T_fmExplAllocOut.AddVTNode(VTParentNode: PVirtualNode; n: TmwDataTreeNode);
{ Recursively add n & its children to VT. }
var
  NodeData: PNodeData;
  VTNode: PVirtualNode;
begin
  if (n = nil) or not NodeInIncludeFilter(n) then
    exit;
      //Add this node
  VTNode := VT.AddChild(VTParentNode);
  NodeData := VT.GetNodeData(VTNode);
  VT.ValidateNode(VTNode, False);        //else OnFreeNode won't get called
  with NodeData^ do begin
    NodeSelf :=         VTNode;
    ContextNode :=      n;
    GridRecordIndex := -1;
  end;
      //Add child nodes
  n := n.GetFirstChild;
  while n <> nil do begin
    AddVTNode(VTNode, n);            //Pass our added node as Parent
    n := n.GetNextSibling;
  end;
end;
Run Code Online (Sandbox Code Playgroud)