Virtual Treeview是一个“纯VCL”控件,这意味着它不是基于任何系统控件,而是重新编写的。正如它的名字已经表明,这个控件与其他这类控件相比,使用了一个不同的树管理模式。它不知道它所管理的数据是什么东西(除了它的大小),甚至没有一个节点的标题。一切都获取于通过应用程序的事件(或通过派生覆盖方法)。Virtual Treeview是经过精心设计和彻底的测试。这个控件证明了它的概念以及在许多商业产品和免费软件的项目中都很健康的运行。
Virtual Treeview是非常快的。增加一百万节点只需要700毫秒。需要很少的内存开销。很适合高速接入,遍历一百万个节点只需要不到0.5秒的时间。支持多选,支持背景图片,支持复选框,支持右键菜单,支持节点排序,支持Unicode,支持拖曳,支持剪贴板,支持多行列标题等等。
官方网站:
http://www.soft-gems.net/index.php
SVN地址:
http://virtual-treeview.googlecode.com/svn/trunk/
本地下载:
javascript:void(0)
安装方法:以Delphi 7为例,用IDE打开".../Packages/Delphi 7"下的"VirtualTreesR.dpk",将".../Source"和".../Common"路径添加到"Environment Options"下的"Library"里,进行"Compile"。再打开"VirtualTreesD.dpk",进行"Compile",接着进行"Install",成功提示如下图:
然后保存退出。
学习Virtual Treeview要通过官方的英文文档和自带的Demos,首先可以看".../Demos/Minimal"的例子,这是最简单的使用示范。下面开始自己测试一下:
1.新建一个Delphi应用程序,拖动"Virtual Controls"面板下的"VirtualStringTree"到窗体上;
2.单元文件所有代码如下:
3.运行结果如下图所示:
java 常用断言 java断言使用场景
一、在eclipse中如何使用断言。 (一)首先明确: 断言是可以局部开启的,如:父类禁止断言,而子类开启断言,所以一般说“断言不具有继承性”。 断言一般用于程序执行结果的判断,千万不要让断言处理业务流程。(二)判断eclipse是否开启了断言,代码如下:public class AssertTest {
public static void main(String[] a
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
{-------------------------------------------------------------------------------
在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.
|