{*------------------------------------------------------------------------------
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, StdCtrls;
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;
Button2: TButton;
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);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
RootNode,RootNode2,ChileNode:PVirtualNode;
implementation
{$R *.dfm}
procedure TForm4.Button2Click(Sender: TObject);
var
CurrentNode,TempNode:PVirtualNode;
Data:PMyRec;
Checked:string;
begin
{示例取点击结点的数据。
注意:TreeOptions.SelectionOptions必须包含toRightClickSelect
}
//取得当前选中结点
CurrentNode:=vsttree.GetFirst;
while Assigned(CurrentNode) do
begin
Data:= vsttree.GetNodeData(CurrentNode);
if CurrentNode.CheckState=csCheckedNormal then
begin
Checked:='是';
end
else
begin
Checked:='否';
end;
ShowMessage('当前结点:'+#13
+'Id='+Data^.Id+#13
+'Text='+Data^.Text+#13
+'是否选中='+Checked+#13
+'根总数='+inttostr(vsttree.RootNodeCount)+#13
+'子总数='+inttostr(vsttree.ChildCount[RootNode]));
//显示子节点数据
if CurrentNode.ChildCount>0 then
begin
TempNode:=CurrentNode;
CurrentNode:=CurrentNode.FirstChild;
while Assigned(CurrentNode) do
begin
Data:= vsttree.GetNodeData(CurrentNode);
if CurrentNode.CheckState=csCheckedNormal then
begin
Checked:='是';
end
else
begin
Checked:='否';
end;
ShowMessage('当前结点:'+#13
+'Id='+Data^.Id+#13
+'Text='+Data^.Text+#13
+'是否选中='+Checked+#13
+'根总数='+inttostr(vsttree.RootNodeCount)+#13
+'子总数='+inttostr(vsttree.ChildCount[RootNode]));
CurrentNode:=CurrentNode.NextSibling;
end;
CurrentNode:=TempNode;
end;
CurrentNode:=CurrentNode.NextSibling;
end;
end;
procedure TForm4.FormCreate(Sender: TObject);
var
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;
//再添加根节点
RootNode2:= vsttree.AddChild(nil);
Data:=vsttree.GetNodeData(RootNode2);
Data^.Text:='根结点2';
Data^.Id:='RootID2';
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;
//再添加一个子结点
ChileNode:=vsttree.AddChild(RootNode);
Data:=vsttree.GetNodeData(ChileNode);
Data^.Text:='子结点3';
Data^.Id:='ChildId3';
Data^.ImageIndex:=1;
Data^.CheckType:=ctTriStateCheckBox;
Data^.CheckState:=csUncheckedNormal;
//添加一个子结点
ChileNode:=vsttree.AddChild(RootNode2);
Data:=vsttree.GetNodeData(ChileNode);
Data^.Text:='子结点4';
Data^.Id:='ChildId4';
Data^.ImageIndex:=1;
Data^.CheckType:=ctTriStateCheckBox;
Data^.CheckState:=csUncheckedNormal;
//再添加一个子结点
ChileNode:=vsttree.AddChild(RootNode2);
Data:=vsttree.GetNodeData(ChileNode);
Data^.Text:='子结点5';
Data^.Id:='ChildId5';
Data^.ImageIndex:=1;
Data^.CheckType:=ctTriStateCheckBox;
Data^.CheckState:=csUncheckedNormal;
//再添加一个子结点
ChileNode:=vsttree.AddChild(RootNode2);
Data:=vsttree.GetNodeData(ChileNode);
Data^.Text:='子结点6';
Data^.Id:='ChildId6';
Data^.ImageIndex:=1;
Data^.CheckType:=ctTriStateCheckBox;
Data^.CheckState:=csUncheckedNormal;
//默认展开一级结点,这句话要写在初始的最后
vsttree.Expanded[RootNode]:=True;
vsttree.Expanded[RootNode2]:=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('当前结点:'+#13
+'Id='+Data^.Id+#13
+'Text='+Data^.Text+#13
+'是否选中='+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.