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 := ; //设置初始化节点数
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
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, VirtualTrees, ImgList, Menus, AdvMenus;
type
{*------------------------------------------------------------------------------
首先,先自己定义一个结点所对应的数据结构。
这一般是一个结构体,内容根据你的需要自己定义
-------------------------------------------------------------------------------}
TMyRec=record
Text: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;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.FormCreate(Sender: TObject);
var
RootNode,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:=;
Data^.CheckType:=ctTriStateCheckBox;
Data^.CheckState:=csUncheckedNormal;
//添加一个子结点
ChileNode:=vsttree.AddChild(RootNode);
Data:=vsttree.GetNodeData(ChileNode);
Data^.Text:='子结点1';
Data^.Id:='ChildId1';
Data^.ImageIndex:=;
Data^.CheckType:=ctTriStateCheckBox;
Data^.CheckState:=csUncheckedNormal;
//再添加一个子结点
ChileNode:=vsttree.AddChild(RootNode);
Data:=vsttree.GetNodeData(ChileNode);
Data^.Text:='子结点2';
Data^.Id:='ChildId2';
Data^.ImageIndex:=;
Data^.CheckType:=ctTriStateCheckBox;
Data^.CheckState:=csUncheckedNormal;
//默认展开一级结点,这句话要写在初始的最后
vsttree.Expanded[RootNode]:=True;
{
注:在这里把数据添加进树后,树里并不能显示出结点
要在几个事件里写代码才行:
OnInitNode:在这个事件里初始化结点,如指定复选框以及状态
OnGetText:在这个事件里指定结点的显示文本
OnGetPopupMenu:在这个事件里指定下拉菜单
OnGetImageIndex:指定结点的图片索引
OnFreeNode:释放结点时您要做的一些释放动作
通过这些事件,才能把结点的显示情况描述清楚。而您的
结构体是用来持有您每个结点的数据的。
}
end;
//弹出菜单的点击事件
procedure TForm4.N1Click(Sender: TObject);
var
CurrentNode:PVirtualNode;
Data:PMyRec;
Checked:string;
begin
{示例取点击结点的数据。
注意:TreeOptions.SelectionOptions必须包含toRightClickSelect
}
//取得当前选中结点
CurrentNode:=vsttree.FocusedNode;
if Assigned(CurrentNode) then
begin
Data:= vsttree.GetNodeData(CurrentNode);
if CurrentNode.CheckState=csCheckedNormal then
begin
Checked:='是';
end
else
begin
Checked:='否';
end;
ShowMessage('当前结点:'+#
+'Id='+Data^.Id+#
+'Text='+Data^.Text+#
+'是否选中='+Checked);
end;
end;
procedure TForm4.vsttreeFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
Data:PMyRec;
begin
Data:=Sender.GetNodeData(Node);
Finalize(Data^);
end;
procedure TForm4.vsttreeGetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
var Ghosted: Boolean; var ImageIndex: Integer);
var
Data:PMyRec;
begin
Data:=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);
begin
if Assigned(Node) then
begin
PopupMenu:=advpmn1;
end
else
begin
PopupMenu:=nil;
end;
end;
procedure TForm4.vsttreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
Data:PMyRec;
begin
Data:=Sender.GetNodeData(Node);
CellText:=Data^.Text;
end;
procedure TForm4.vsttreeInitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
Data:PMyRec;
begin
Data:=Sender.GetNodeData(Node);
Node.CheckType:=Data^.CheckType;
Node.CheckState:=Data^.CheckState;
end;
end. 

Virtual Treeview 安装以及入门的更多相关文章

  1. Apache Hadoop2.x 边安装边入门

    完整PDF版本:<Apache Hadoop2.x边安装边入门> 目录 第一部分:Linux环境安装 第一步.配置Vmware NAT网络 一. Vmware网络模式介绍 二. NAT模式 ...

  2. bower安装使用入门详情

    bower安装使用入门详情   bower自定义安装:安装bower需要先安装node,npm,git全局安装bower,命令:npm install -g bower进入项目目录下,新建文件1.tx ...

  3. [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍

    前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...

  4. 虚拟光驱 DAEMON Tools Lite ——安装与入门

    DAEMON Tools Lite 是什么?它不仅仅是虚拟光驱.是的,你可以使用它制作.加载光盘映像,但是 DAEMON Tools 产品那么多,Lite版与其他版本究竟有什么不同呢?或者说,是什么让 ...

  5. 解决Virtual Box 安装Mac OS X当出现“hfs: summary table not allowed on FS with block size of 2048”问题

    解决Virtual Box 安装Mac OS X当出现"hfs: summary table not allowed on FS with block size of 2048"问 ...

  6. Python 3.6.3 官网 下载 安装 测试 入门教程 (windows)

    1. 官网下载 Python 3.6.3 访问 Python 官网 https://www.python.org/ 点击 Downloads => Python 3.6.3 下载 Python ...

  7. 八:Lombok 安装、入门 - 消除冗长的 java 代码

    Lombok 安装.入门 - 消除冗长的 java 代码 前言:    逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下.    lombok 提供了简单的注解的形式来帮助我们简化消 ...

  8. robotframework安装及入门指南

    将很久之前自己在本地记录的一些笔记发表到随笔来,希望能够帮到一些童鞋~ robotframework安装及入门指南 本文主要介绍robotframework在windows环境的安装过程! 安装步骤 ...

  9. pytest_01_安装和入门

    目录 pytest 安装与入门 1.pip install -U pytest 2.创建一个test01.py的文件 3.在该目录下执行pytest(venv) 4.执行多个,新建一个py文件 tes ...

随机推荐

  1. jQuery对的表单数据序列化和校验

    jQuery对的表单数据序列化和校验 表单序列化 如果想让表单通过ajax异步提交,那么首先我们要通过js获取到每个表单中输入的值,如果表单项比较多的话,是一件很麻烦,很痛苦的事情,那么我们可以通过j ...

  2. 前端html第三方登录集合,微信,微博,QQ

    申请开发者账号之内的就不累赘了,网上一大堆: 说下需求,一个网页要在三类容器运行,公司app,微信自动登录,浏览器. 假设是已经申请完成各平台开发者账号. 先来简单的,微博和QQ 微博: 引入微博JS ...

  3. LightOJ 1323 Billiard Balls(找规律(蚂蚁爬木棍))

    题目链接:https://vjudge.net/contest/28079#problem/M 题目大意: 一个边界长为L宽为W的平面同时发射n个台球,运动K秒,台球碰到桌面及两(多)个台球相撞情况如 ...

  4. HTTP协议头注射漏洞实例

    HTTP 响应头文件中包含未经验证的数据会引发 cache-poisoning.cross-site scripting.cross-user defacement.page hijacking.co ...

  5. Scrapy 增加随机请求头 user_agent

    原文: 为什么要增加随机请求头:更好地伪装浏览器,防止被 Ban. 如何在每次请求时,更换不同的 user_agent,Scrapy 使用 Middleware 即可 Spider 中间件 (Midd ...

  6. Typecho-反序列化漏洞学习

    目录 Typecho-反序列化漏洞学习 0x00 前言 0x01 分析过程 0x02 调试 0x03 总结 0xFF 参考 Typecho-反序列化漏洞学习 0x00 前言 补丁: https://g ...

  7. 《互联网MySQL开发规范》

    一.基础规范 使用 INNODB 存储引擎 表字符集使用 UTF8  所有表都需要添加注释 单表数据量建议控制在 5000W 以内 不在数据库中存储图⽚.文件等大数据 禁止在线上做数据库压力测试 禁⽌ ...

  8. JS 汉字与Unicode码的相互转化

    js文件中,有些变量的值可能会含有汉字,画面引入js以后,有可能会因为字符集的原因,把里面的汉字都变成乱码.后来发现网上的一些js里会把变量中的汉字都表示成”\u“开头的16进制编码,这样应该可以解决 ...

  9. CodeForcs 797E Array Queries

    $dp$预处理,暴力. 如果$k > sqrt(n)$,那么答案不会超过$sqrt(n)$,暴力模拟即可.如果$k <= sqrt(n)$,那么可以$dp$预处理打表. #include ...

  10. LCA:Tarjan算法实现

    本博文转自http://www.cnblogs.com/JVxie/p/4854719.html,转载请注明出处 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有 ...