Virtual TreeView使用示例
Virtual TreeView是一个功能强大的delphi树型组件,从它带的例子就能看出来。下面我把我做的如下图所示的树型的代码贴出来,供大家参考:
源码:
- {*------------------------------------------------------------------------------
- VirtualTreeView使用示例
- @author屈剑峰email:[email protected]
- @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.