Jef*_*eff 5 delphi tree virtualtreeview
我需要一个可以与Virtual Treeview一起使用的树实现,它不会消耗太多内存,易于使用,并且与VT一样快(也就是说,当我将数据存储在VT本身时)
我尝试过Linas的svTree - 它易于使用,但不如我希望的那么快和内存友好.
此外,只想指出我的应用程序将管理数千个节点.:)
你推荐什么免费图书馆?您是否能够构建一个如何在Virtual Treeview中使用它的最小演示?
查看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)
| 归档时间: |
|
| 查看次数: |
1224 次 |
| 最近记录: |