我需要一个可以与Virtual Treeview一起使用的树实现,它不会消耗太多内存,易于使用,并且与VT一样快(也就是说,当我将数据存储在VT本身)
我尝试过Linas的svTree - 它易于使用,但不如我希望的那么快和内存友好。
另外,只想指出我的应用程序将管理数千个节点。 :)
您推荐哪些免费图书馆?您是否能够构建一个如何在Virtual Treeview中使用它的最小演示?
答案 0 :(得分:3)
查看rmControls库中的rmTreeNonView
组件。
我们多年来一直在使用该树的修改版本作为数据容器。它是免费的,快速的,非可视的,带有源代码,并且很容易上手,因为重复TTreeView的方法和属性几乎100%,并且还添加了一些自己的方法 - 特别是基于哈希的快速搜索树节点路径。
我怀疑该公司已经开始营业了(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;
答案 1 :(得分:3)
您不需要用于记住数据的控件或库。您需要提供适合您需求的数据结构。最后一步是使用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 :(得分:2)
听起来你有非常具体的需求,所以我觉得没有完整的解决方案来满足你的确切要求。
我的第一个建议是使用数据库。它拥有你需要的所有功能,以及强大而快速的额外奖励。很明显,您将不得不编写一些例程来处理数据的添加/删除/插入/编辑等。关系数据库将能够存储您的类别之间的所有关系,并且可以轻松更改记录之间的关系(节点)。花些时间学习如何存储层次数据,然后了解节点之间的关系。精心设计的数据库将为您提供项目的所有细节。 MySQL是免费的,使用起来非常简单。占地面积小,但速度非常快。看一下本文,可以让您思考如何以关系方式存储树数据结构:Relational Tree Data structures。
话虽如此,我不太确定你在寻找什么。
数据库如何存储树的示例:
如果数据库不可行,那么我鼓励你自己编写课程。只有您知道您的数据如何管理并融合在一起。因此,你可以编写您的树需要操作和调整的确切功能。首先查看TObjectList。创建存储每个节点数据的类对象。然后,您可以创建这些对象的列表以容纳所有节点。编写方法来模仿在树上执行的用户操作,例如添加,更新,移动等可能需要一些时间,但它确实可以帮助您学习并使您作为应用程序设计人员受益。当你遇到困难时,请随时提出问题。
答案 3 :(得分:0)
答案中列出了一些有趣的非可视树: Delphi non visual TTree implementation
其中一个可能适合您的需求。