Virtual TreeView使用示例
Virtual TreeView是一个功能强大的delphi树型组件,从它带的例子就能看出来。下面我把我做的如下图所示的树型的代码贴出来,供大家参考:
源码:
- {*------------------------------------------
- VirtualTreeView使用示例
- @author屈剑峰email:qujianfeng@gmail.com@version2008/10/161.0Initialrevision.
- @todo@comment
- -------------------------------------------} unitUnit4;
- 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;
- procedureFormCreate(Sender:TObject); procedurevsttreeGetText(Sender:TBaseVirtualTree;Node:PVirtualNode;
- Column:TColumnIndex;TextType:TVSTTextType;varCellText:WideString); procedurevsttreeInitNode(Sender:TBaseVirtualTree;ParentNode,
- Node:PVirtualNode;varInitialStates:TVirtualNodeInitStates); procedurevsttreeGetImageIndex(Sender:TBaseVirtualTree;Node:PVirtualNode;
- Kind:TVTImageKind;Column:TColumnIndex;varGhosted:Boolean; varImageIndex:Integer);
- procedureN1Click(Sender:TObject); procedurevsttreeFreeNode(Sender:TBaseVirtualTree;Node:PVirtualNode);
- procedurevsttreeGetPopupMenu(Sender:TBaseVirtualTree;Node:PVirtualNode; Column:TColumnIndex;constP:TPoint;varAskParent:Boolean;
- varPopupMenu:TPopupMenu); private
- {Privatedeclarations} public
- {Publicdeclarations} end;
- var
- Form4:TForm4;
- implementation
- {$R*.dfm}
- procedureTForm4.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:=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;
- //弹出菜单的点击事件 procedureTForm4.N1Click(Sender:TObject);
- var CurrentNode:PVirtualNode;
- Data:PMyRec;Checked:string;
- begin {示例取点击结点的数据。
- 注意:TreeOptions.SelectionOptions必须包含toRightClickSelect}
- //取得当前选中结点 CurrentNode:=vsttree.FocusedNode;
- ifAssigned(CurrentNode)then begin
- Data:=vsttree.GetNodeData(CurrentNode); ifCurrentNode.CheckState=csCheckedNormalthen
- begin Checked:='是';
- end else
- begin Checked:='否';
- end; ShowMessage('当前结点:'+#13
- +'Id='+Data^.Id+#13 +'Text='+Data^.Text+#13
- +'是否选中='+Checked); end;
- end;
- procedureTForm4.vsttreeFreeNode(Sender:TBaseVirtualTree;Node:PVirtualNode); var
- Data:PMyRec;begin
- Data:=Sender.GetNodeData(Node); Finalize(Data^);
- end;
- procedureTForm4.vsttreeGetImageIndex(Sender:TBaseVirtualTree; Node:PVirtualNode;Kind:TVTImageKind;Column:TColumnIndex;
- varGhosted:Boolean;varImageIndex:Integer); var
- Data:PMyRec;begin
- Data:=Sender.GetNodeData(Node); ImageIndex:=Data^.ImageIndex;
- end;
- procedureTForm4.vsttreeGetPopupMenu(Sender:TBaseVirtualTree; Node:PVirtualNode;Column:TColumnIndex;constP:TPoint;
- varAskParent:Boolean;varPopupMenu:TPopupMenu); begin
- ifAssigned(Node)then begin
- PopupMenu:=advpmn1;end
- else begin
- PopupMenu:=nil; end;
- end;
- procedureTForm4.vsttreeGetText(Sender:TBaseVirtualTree;Node:PVirtualNode; Column:TColumnIndex;TextType:TVSTTextType;varCellText:WideString);
- var Data:PMyRec;
- begin Data:=Sender.GetNodeData(Node);
- CellText:=Data^.Text;end;
- procedureTForm4.vsttreeInitNode(Sender:TBaseVirtualTree;ParentNode,
- Node:PVirtualNode;varInitialStates:TVirtualNodeInitStates); var
- Data:PMyRec;begin
- Data:=Sender.GetNodeData(Node); Node.CheckType:=Data^.CheckType;
- Node.CheckState:=Data^.CheckState; end;
- end.