Virtual Treeview 安装以及入门

article/2025/9/23 20:55:25

Virtual Treeview是一套Delphi下优秀的VCL控件,代码质量高,使用灵活、功能强大、性能非常好,可以用于表达Treeview和表格类数据。它的代码现在托管在google code上。

Virtual Treeview是一个“纯VCL”控件,这意味着它不是基于任何系统控件,而是重新编写的。正如它的名字已经表明,这个控件与其他这类控件相比,使用了一个不同的树管理模式。它不知道它所管理的数据是什么东西(除了它的大小),甚至没有一个节点的标题。一切都获取于通过应用程序的事件(或通过派生覆盖方法)。Virtual Treeview是经过精心设计和彻底的测试。这个控件证明了它的概念以及在许多商业产品和免费软件的项目中都很健康的运行。

    Virtual Treeview是非常快的。增加一百万节点只需要700毫秒。需要很少的内存开销。很适合高速接入,遍历一百万个节点只需要不到0.5秒的时间。支持多选,支持背景图片,支持复选框,支持右键菜单,支持节点排序,支持Unicode,支持拖曳,支持剪贴板,支持多行列标题等等。

官方网站 : http://www.delphi-gems.com/index.php/controls/virtual-treeview

google code : https://code.google.com/p/virtual-treeview/

https://code.google.com/p/virtual-treeview/downloads/list

svn checkout http://virtual-treeview.googlecode.com/svn/trunk/ virtual-treeview-read-only

The current Version of Virtual Treeview is 5.2.1.

http://www.delphi-gems.com/index.php/controls/virtual-treeview-history

Installation

Starting with version 5.0 Virtual Treeview no longer comes with an own setup program

because there is a set of design and runtime packages for each supported IDE version,

which can easily be opened to compile and install the control in the IDE.

Virtual Treeview supports the following IDEs (and their associated VCLs):

  • Embacadero's RAD Studio XE - XE4
  • Delphi 2010
  • CBuilder 2010
  • Delphi 2009
  • Delphi 2007
  • BDS 2006
  • Delphi 2005
  • Delphi 7

学习Virtual Treeview要通过官方的英文文档和自带的Demos

http://blog.csdn.net/akof1314/article/details/6449889

复制代码
{------------------------------------------------------------------------------- 在Delphi 7下Virtual Treeview的简单使用    http://blog.csdn.net/akof1314 
-------------------------------------------------------------------------------} 
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, VirtualTrees, StdCtrls; type TForm1 = class(TForm) vrtlstrngtrVST: TVirtualStringTree; btnAddRoot: TButton; btnAddChildren: TButton; btnClear: TButton; edtNumber: TEdit; grp1: TGroupBox; procedure FormCreate(Sender: TObject); procedure btnAddRootClick(Sender: TObject); procedure btnAddChildrenClick(Sender: TObject); procedure btnClearClick(Sender: TObject); procedure vrtlstrngtrVSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); procedure vrtlstrngtrVSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); procedure vrtlstrngtrVSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} 
{------------------------------------------------------------------------------- Description: 定义一个记录类型,根据所需添加内容 
-------------------------------------------------------------------------------} 
type PMyRec = ^TMyRec; TMyRec = record            //记录自己的节点结构类型 Caption: String; end; 
{------------------------------------------------------------------------------- Description: 创建创建函数 
-------------------------------------------------------------------------------} 
procedure TForm1.FormCreate(Sender: TObject); 
begin vrtlstrngtrVST.NodeDataSize := SizeOf(TMyRec);   //设置节点数据空间 vrtlstrngtrVST.RootNodeCount := 20;              //设置初始化节点数 
end; 
{------------------------------------------------------------------------------- Description: 添加节点 
-------------------------------------------------------------------------------} 
procedure TForm1.btnAddRootClick(Sender: TObject); 
var Count: Cardinal; 
begin Count := StrToInt(edtNumber.Text); vrtlstrngtrVST.RootNodeCount := vrtlstrngtrVST.RootNodeCount + Count; 
end; 
{------------------------------------------------------------------------------- Description: 添加子节点 
-------------------------------------------------------------------------------} 
procedure TForm1.btnAddChildrenClick(Sender: TObject); 
var Count: Cardinal; 
begin with vrtlstrngtrVST do begin if Assigned(FocusedNode) then begin Count := StrToInt(edtNumber.Text); ChildCount[FocusedNode] := ChildCount[FocusedNode] + Count; Expanded[FocusedNode] := True;      //展开节点 InvalidateToBottom(FocusedNode);    //刷新此节点以下的区域 end; end; 
end; 
{------------------------------------------------------------------------------- Description: 清除所有节点 
-------------------------------------------------------------------------------} 
procedure TForm1.btnClearClick(Sender: TObject); 
begin vrtlstrngtrVST.Clear; 
end; 
{------------------------------------------------------------------------------- Description: 每个节点异步触发一次 
-------------------------------------------------------------------------------} 
procedure TForm1.vrtlstrngtrVSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); 
var Data: PMyRec; 
begin with Sender do begin Data := GetNodeData(Node); Data.Caption := Format('等级 %d,索引 %d',[GetNodeLevel(Node),Node.Index]); end; 
end; 
{------------------------------------------------------------------------------- Description: 树节点显示的字符串数据 
-------------------------------------------------------------------------------} 
procedure TForm1.vrtlstrngtrVSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); 
var Data: PMyRec; 
begin Data := Sender.GetNodeData(Node); if Assigned(Data) then CellText := Data.Caption; 
end; 
{------------------------------------------------------------------------------- Description: 释放节点数据 
-------------------------------------------------------------------------------} 
procedure TForm1.vrtlstrngtrVSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); 
var Data: PMyRec; 
begin Data := Sender.GetNodeData(Node); Finalize(Data^); 
end; end. 
复制代码

http://hi.baidu.com/cpplyy/item/0ad7b706da1647cd90571811

Delphi 之 Virtual Treeview 使用心得

Virtual Treeview是一个可以完全代替Delphi自带的Treeview和Listview的免费完全源码控件,但使用复杂。在看完几个自带DEMO后的一点心得。

1.定义节点的数据结构
2.GetNodeDataSize事件 FreeNode事件
3.GetText事件 根据Column来写多列
4.GetImageIndex事件 同上
5.PaintText事件 自定义TargetCanvas
6.GetPopupMenu事件 设定PopupMenu
7.OnSaveNode和Onloadnode 保存为文件,需要自己实现这二个事件


显示Header
1.双击VST
2.添加Column
3.Include( VST.Header.Option, hoVisible);

显示单选、复选框
Include(VST.TreeOptions.MiscOptions,toCheckSupport);
VST.CheckImageKind :=ckXP;
Node.CheckType :=ctCheckBox;//新加节点如果要显示复选框,一定要指定,默认值ctNone
Node.CheckState=csCheckedNormal;//是否选中状态

显示提示
ShowHint 属性True
HintMode 属性hmHint
在GetHint事件写获取HintText代码

不显示TreeLine
TreeOption->PaintOptions->toShowTreeLines

添加节点
var
Node: PVirtualNode;
Data: PVSTNode;
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);

更新显示
VST.InvalidateNode(Node);


当前选中的节点
VST.FocusedNode

编辑节点
事件VST.OnEditing中Allowed为True 或者在TreeOptions->MiscOptions->toEditable属性 置为Ture
调用VST.EditNode 
改写后触发NewText事件(注意,需要更新节点的Data中数据)
相关参数,EditDelay

获取节点层数
vst.GetNodeLevel(Node); 注:从0开始

遍历全部节点
var
Node:PVirtualNode;
Data:PNodeData;
begin
Node:= VST.GetFirst;
while Assigned(Node) do
begin
Data := VST.GetNodeData(Node);
...
Node := VST.GetNext(Node);
end;

遍历某节点的全部子节点
SubNode := Node.FirstChild;
while SubNode <> nil do
begin
...
SubNode := SubNode.NextSibling;
end;

http://blog.csdn.net/jianfengqu/article/details/3533900

 

Virtual TreeView使用示例

Virtual TreeView是一个功能强大的delphi树型组件,从它带的例子就能看出来。下面我把我做的如下图所示的树型的代码贴出来,供大家参考:

复制代码
{*------------------------------------------------------------------------------Virtual TreeView使用示例@author  屈剑峰  email: qujianfeng@gmail.com@version 2008/10/16 1.0 Initial revision.@todo@comment
-------------------------------------------------------------------------------}          
unit Unit4;
interface
usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, VirtualTrees, ImgList, Menus, AdvMenus;
type{*------------------------------------------------------------------------------首先,先自己定义一个结点所对应的数据结构。这一般是一个结构体,内容根据你的需要自己定义-------------------------------------------------------------------------------}  TMyRec=recordText:string;//结点显示的文本 ImageIndex:Integer;//结点显示的图片索引。注意:要在结点显示图片必须TreeOptions.MiscOptions包含toCheckSuppot Id:string;//数据Id,可以为数据库记录的Id CheckType:TCheckType; //选择框类型 CheckState:TCheckState;//选择框状态 //...你还可以自己加 end;{*------------------------------------------------------------------------------定义一个上面结构体的指针类型,后面要用到这个东东-------------------------------------------------------------------------------}  PMyRec=^TMyRec;TForm4 = class(TForm)vsttree: TVirtualStringTree;il1: TImageList;advpmn1: TAdvPopupMenu;N1: TMenuItem;procedure FormCreate(Sender: TObject);procedure vsttreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);procedure vsttreeInitNode(Sender: TBaseVirtualTree; ParentNode,Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);procedure vsttreeGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean;var ImageIndex: Integer);procedure N1Click(Sender: TObject);procedure vsttreeFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);procedure vsttreeGetPopupMenu(Sender: TBaseVirtualTree; Node: PVirtualNode;Column: TColumnIndex; const P: TPoint; var AskParent: Boolean;var PopupMenu: TPopupMenu);private{ Private declarations }public{ Public declarations }end;
varForm4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.FormCreate(Sender: TObject);
varRootNode,ChileNode:PVirtualNode;Data:PMyRec;
begin//指定结点数据大小 vsttree.NodeDataSize:=SizeOf(TMyRec);//指定树里要用的图片列表 vsttree.Images:=il1;//添加根节点 RootNode:= vsttree.AddChild(nil);Data:=vsttree.GetNodeData(RootNode);Data^.Text:='根结点';Data^.Id:='RootID';Data^.ImageIndex:=0;Data^.CheckType:=ctTriStateCheckBox;Data^.CheckState:=csUncheckedNormal;//添加一个子结点 ChileNode:=vsttree.AddChild(RootNode);Data:=vsttree.GetNodeData(ChileNode);Data^.Text:='子结点1';Data^.Id:='ChildId1';Data^.ImageIndex:=1;Data^.CheckType:=ctTriStateCheckBox;Data^.CheckState:=csUncheckedNormal;//再添加一个子结点 ChileNode:=vsttree.AddChild(RootNode);Data:=vsttree.GetNodeData(ChileNode);Data^.Text:='子结点2';Data^.Id:='ChildId2';Data^.ImageIndex:=1;Data^.CheckType:=ctTriStateCheckBox;Data^.CheckState:=csUncheckedNormal;//默认展开一级结点,这句话要写在初始的最后 vsttree.Expanded[RootNode]:=True;{注:在这里把数据添加进树后,树里并不能显示出结点要在几个事件里写代码才行:OnInitNode:在这个事件里初始化结点,如指定复选框以及状态OnGetText:在这个事件里指定结点的显示文本OnGetPopupMenu:在这个事件里指定下拉菜单OnGetImageIndex:指定结点的图片索引OnFreeNode:释放结点时您要做的一些释放动作通过这些事件,才能把结点的显示情况描述清楚。而您的结构体是用来持有您每个结点的数据的。}
end;
//弹出菜单的点击事件 
procedure TForm4.N1Click(Sender: TObject);
varCurrentNode:PVirtualNode;Data:PMyRec;Checked:string;
begin{示例取点击结点的数据。注意:TreeOptions.SelectionOptions必须包含toRightClickSelect}//取得当前选中结点 CurrentNode:=vsttree.FocusedNode;if Assigned(CurrentNode) thenbeginData:= vsttree.GetNodeData(CurrentNode);if CurrentNode.CheckState=csCheckedNormal thenbeginChecked:='';endelsebeginChecked:='';end;  ShowMessage('当前结点:'+#13+'Id='+Data^.Id+#13+'Text='+Data^.Text+#13+'是否选中='+Checked);end;  
end;
procedure TForm4.vsttreeFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
varData:PMyRec;
beginData:=Sender.GetNodeData(Node);Finalize(Data^);
end;
procedure TForm4.vsttreeGetImageIndex(Sender: TBaseVirtualTree;Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;var Ghosted: Boolean; var ImageIndex: Integer);
varData:PMyRec;
beginData:=Sender.GetNodeData(Node);ImageIndex:=Data^.ImageIndex;
end;
procedure TForm4.vsttreeGetPopupMenu(Sender: TBaseVirtualTree;Node: PVirtualNode; Column: TColumnIndex; const P: TPoint;var AskParent: Boolean; var PopupMenu: TPopupMenu);
beginif Assigned(Node) thenbeginPopupMenu:=advpmn1;endelsebeginPopupMenu:=nil;end;    
end;
procedure TForm4.vsttreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
varData:PMyRec;
beginData:=Sender.GetNodeData(Node);CellText:=Data^.Text;
end;
procedure TForm4.vsttreeInitNode(Sender: TBaseVirtualTree; ParentNode,Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
varData:PMyRec;
beginData:=Sender.GetNodeData(Node);Node.CheckType:=Data^.CheckType;Node.CheckState:=Data^.CheckState;
end;
end
复制代码

http://chatgpt.dhexx.cn/article/PAFxyoEA.shtml

相关文章

android treeview 树形结构,前端开发中,使用TreeView控件创建树形结构

原标题&#xff1a;前端开发中&#xff0c;使用TreeView控件创建树形结构 Wijmo是一款使用Type编写的新一代Java/HTML5控件集。它秉承触控优先的设计理念&#xff0c;在全球率先支持AngularJS&#xff0c;并提供性能卓越、零依赖的FlexGrid和图表等多个控件。 我们已经知道在Wi…

透透彻彻了解服务器技术

什么是服务器   服务器是一种高性能计算机&#xff0c;作为网络的节点&#xff0c;存储、处理网络上80&#xff05;的数据、信息&#xff0c;因此也被称为网络的灵魂。做一个形象的比喻&#xff1a;服务器就像是邮局的交换机&#xff0c;而微机、笔记本、PDA、手机等固定或移…

服务器的介绍

一 、IDC/机柜/物理server/云主机介绍 1.互联网数据中心 &#xff08;Internet Data Center&#xff09; 互联网数据中心图片 &#xff08;1&#xff09;IDC的简介 简称IDC&#xff0c;是电信部门利用已有的互联网通信线路、带宽资源&#xff0c;建立的标准化电信专业级机房环…

web服务器(技术讲解)

2.Web服务器&#xff08;技术讲解&#xff09; 1.ASP 微软&#xff1a;国内最早流行在HTML中嵌入了VB脚本&#xff0c;ASPCOM在ASP开发中&#xff0c;基本一个页面有几千行的业务代码&#xff0c;页面杂乱&#xff0c;维护成本非常高 2.PHP 开发速度很快&#xff0c;功能强…

关于服务器

初始服务器 云操作 以下是重装系统操作 出现黑窗口后&#xff1a; 输入—>sudo passwd命令–>输入密码&#xff08;密码不可见&#xff09;–>再次输入密码&#xff08;密码不可见&#xff09;–>su命令&#xff08;可使用root用户&#xff09;–>输入密码&…

云服务器简介

云服务器简介 一、云服务器二、云服务的灵魂——虚拟化三、云服务器ECS概念 一、云服务器 1、云服务器简介 云计算服务器又称为云服务器或云主机&#xff0c;是云计算服务体系中的一项主机产品&#xff0c;它有效地解决了传统物理主机与VPS服务中&#xff0c;存在的管理难度打…

服务器概述

1、什么是服务器&#xff1f; 服务器&#xff1a;分为服务器硬件和服务器软件。在硬件服务器&#xff08;计算机&#xff09;上安装服务器软件&#xff0c;才可以对外提供服务。 比如&#xff1a;让其他的计算机访问当前服务器&#xff0c;为其他的计算机提供服务。 &#xff…

服务器技术(三)--Nginx

Nginx介绍 Nginx是什么、适用场景 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好。 Nginx专为性能优化而开发&#xff0c;性能是其最重要的考量&#xf…

2022年,服务器领域十大技术趋势

2020年&#xff0c;疫情的全球爆发对上半年服务器市场的出货量带来了不小的影响。但是随着下半年疫情逐渐得到控制以及数字化需求的激增&#xff0c;全球服务器市场呈现出非常不错的增长态势。 目前来看&#xff0c;服务器依然是数字化转型和云计算、互联网等技术发展基础&…

服务器端技术

简介&#xff1a; 服务器分为web服务器和应用服务器。Web服务器是离客户端最近的服务器&#xff0c;负责监听和处理HTTP请求。应用服务器比web服务器更靠近后端&#xff0c;主要处理复杂的业务逻辑和数据库的访问。 如果是静态资源&#xff08;例如HTML页面或图片&#xff09;…

云计算服务器技术概述

云计算服务器技术概述 概述 云主机也叫云服务器ECS (Elastic Compute Server)&#xff0c;是一种按需获取的云端服务器&#xff0c;提供高可靠、弹性扩展的计算资源服务&#xff0c;可以根据需求选择不同规格的CPU、内存、操作系统、硬盘和网络来创建云主机&#xff0c;满足个性…

什么是服务器 ?服务器常见的系统和技术有哪些?

就像他的名字一样&#xff0c;服务器在网络上为不同用户提供不同内容的信息、资料和文件。可以说服务器就是Internet网络上的资源仓库&#xff0c;正是因为有着种类繁多数量庞大内容丰富的服务器的存在&#xff0c;才使得Internet如此的绚丽多彩。 服务器的种类和功能: (1) WW…

“东数西算”下数据中心的液冷GPU服务器如何发展?

以云计算、大数据、人工智能、高性能计算、数据分析、数据挖掘等为首的新兴技术凭借其优越的便利性和稳定性开始为服务器市场带来新的生机活力&#xff0c;其中以GPU为首的AI服务器在一定程度上不仅重构现行的产业结构&#xff0c;也为整个市场带来了新的有效增量。那么服务器的…

服务器技术基础

服务器技术基础 服务器是计算机的一种&#xff0c;比普通计算机运行更快、负载更高、价格更贵。服务器在网络中为其它客户机&#xff08;如PC机、智能手机、ATM等终端甚至是火车系统等大型设备&#xff09;提供计算或者应用服务。服务器具有高速的CPU运算能力、长时间的可靠运行…

1、NetBIOS简介

“网络基本输入&#xff0f;输出系统” &#xff08;Network Basic Input/Output System, NetBIOS&#xff09;是一种标准的应用程序编程接口&#xff08;A P I&#xff09;&#xff0c;1983年由Sytek公司专为IBM开发成功。NetBIOS为网络通信定义了一种编程接口&#xff0c;但却…

NetBIOS初步了解

NetBIOS定义及作用 NetBIOS&#xff1a;是Network Basic Input/Output System的简称&#xff0c;一般指用于局域网通信的一套API。作用是为了给局域网提供网络以及其他特殊功能&#xff0c;系统可以利用WINS服务、广播及Lmhost文件等多种模式将主机名解析为相应IP地址&#xf…

BIOS 常用网站 (持续更新中)

UEFI 官网 下载UEFI/PI/ACPI 等SPEC Welcome to Unified Extensible Firmware Interface Forum | Unified Extensible Firmware Interface Forumhttps://uefi.org/ AMD资料 (需账号权限) 下载AMD芯片资料 Login – AMD DevHubhttps://devhub.amd.com/ Rw工具 OS下读取寄存…

更改netbios计算机名,NetBIOS主机名解析

原创]NetBIOS主机名解析 NetBIOS主机名解析主要使用其子协议NetBIOS Name Service协议来进行。 工作组&#xff1a;是网络中具有相同“Workgroup”名字的主机组成。用户可以修改此组名子加入另一个组。 属于同一个工作组的主机才能相互通告主机名&#xff0c;不同的工作组之间不…

浅谈netbios

Netbios想必大家都有接触。对于netbios的理解&#xff0c;我以前有很多困惑&#xff0c;不知道如何掌握这些知识点&#xff0c;这几天通过了一段时间的实验和学习&#xff0c;有了一些体会&#xff0c;和大家一起分享。 阅读本文&#xff0c;你可以了解到以下内容 ◆netbios的…

NetBIOS 计算机名称命名限制

本文告诉大家对于 NetBIOS 的命名的限制 长度限制 最小长度是 1 最长长度是 15 因为默认是 16 字符&#xff0c;但是微软使用最后一个字符作为后缀 可以使用的字符 可以使用英文和数字 abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789可以使用下面的符号…