【问题标题】:What is the best free 3rd Party Tree-implementation for Delphi?Delphi 最好的免费第 3 方树实现是什么?
【发布时间】:2011-05-09 11:07:57
【问题描述】:

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

我试用了 Linas 的 svTree - 它易于使用,但没有我希望的那么快和内存友好。

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

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

【问题讨论】:

  • 为什么需要这个?我永远不会离开 VT。
  • @daemon_x,Jeff 一直在为 VT 处理底层树数据结构;他想要一个可以与VT一起使用的数据结构。
  • @daemon_x,他不想要其他组件,他想使用 VT,但为了获得 VT 的全部功能,他需要将数据保存到 VT 之外的单独数据结构中.由于他的数据不应该驻留在 VT 节点中,TVirtualNode 不是解决方案。
  • 您已经在某处保存了数据。用那个。无需将其复制到另一个结构中即可将其显示到 UI。您在哪里发现问题?
  • @lars 他没有在其他地方保存数据。它归树视图所有。他需要一棵树。

标签: delphi tree virtualtreeview


【解决方案1】:

您不需要控件或库来记住数据。您需要提出一个适合您需求的数据结构。最后一步是使用 VTV 或任何其他控件来显示您的数据结构。暂时停止考虑 GUI,想想你想如何构建你的数据结构。想想设计模式和老式编程、链接列表、数组、队列、哈希列表/字典、红/黑树等。在搜索、遍历、添加的速度和内存使用方面,每个都有自己的优缺点。有一些库(如http://www.boyet.com/FixedArticles/EZDSL.html)有基本的构建块,但你必须弄清楚你想要什么。如果您卡在那里,我建议您提出一个新问题并指定数据结构的要求。您可能想阅读https://sites.google.com/site/igetfreebook/The-Tomes-of-Delphi-Algorithms-and-Data-Structures

如果您的问题是关于同时存储数据的 GUI 控件,那么我想知道您为什么不想使用 VTV。也许其他控件更容易,但从设计的角度来看,它们并不是更好。您仍在将数据存储在 GUI 控件中。

【讨论】:

【解决方案2】:

查看rmControls 库中的rmTreeNonView 组件。

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

我怀疑这家公司已经不再营业了 (http://www.mills-enterprise.ca),但是许多 Delphi 下载站点上都提供了包含源代码的 rmControls 包。

编辑:

这里有一些代码显示了如何从 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;

【讨论】:

  • 我将不得不对其进行研究 - 所以你会说它非常推荐与 TVirtualStringtree 一起使用吗? :)
  • @Jeff - 由谁“推荐”,在什么特定目的的背景下? 推荐它作为适合我的目的的树状结构数据容器,但不知道它是否适合你。 (一般情况下,您只能通过自己查看组件的功能来回答此类问题。)
【解决方案3】:

听起来您有非常具体的需求,所以我觉得不会有一个完整的解决方案来满足您的确切要求。

我的第一个建议是使用数据库。它具有我(认为)您需要的所有功能,以及强大且非常快速的额外好处。显然,您将不得不编写一些例程来处理数据的添加/删除/插入/编辑等。关系数据库将能够存储您的类别之间的所有关系,并轻松更改记录之间的关系(节点)。花时间学习如何存储分层数据,然后了解节点之间的关系。精心设计的数据库将为您提供项目的所有细节。 MySQL 是免费的,而且使用起来非常简单。占地面积小,但速度非常快。看看这篇文章,让您思考如何以关系方式存储树数据结构:Relational Tree Data structures

说了这么多,我不太确定这就是你要找的。​​p>

一个数据库如何存储你的树的例子:

如果数据库不可行,那么我鼓励您编写自己的类。只有知道您的数据是如何管理和组合在一起的。因此可以编写你的树需要一起操作和组合的确切功能。从查看 TObjectList 开始。创建为每个节点存储数据的类对象。然后,您可以创建这些对象的列表来保存所有节点。编写方法来模拟在树上执行的用户操作,例如添加、更新、移动等。这可能需要一些时间,但它确实会帮助您学习,并使您作为应用程序设计师受益。当您遇到困难时,请随时提出问题。

【讨论】:

    【解决方案4】:

    以下答案中列出了一些有趣的非可视树: Delphi non visual TTree implementation

    其中一个可能适合您的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      相关资源
      最近更新 更多