`
qujianfeng
  • 浏览: 77583 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Virtual TreeView使用示例

阅读更多

Virtual TreeView是一个功能强大的delphi树型组件,从它带的例子就能看出来。下面我把我做的如下图所示的树型的代码贴出来,供大家参考:

源码:

  1. {*------------------------------------------------------------------------------
  2. VirtualTreeView使用示例
  3. @author屈剑峰email:qujianfeng@gmail.com
  4. @version2008/10/161.0Initialrevision.
  5. @todo
  6. @comment
  7. -------------------------------------------------------------------------------}
  8. unitUnit4;
  9. interface
  10. uses
  11. Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
  12. Dialogs,VirtualTrees,ImgList,Menus,AdvMenus;
  13. type
  14. {*------------------------------------------------------------------------------
  15. 首先,先自己定义一个结点所对应的数据结构。
  16. 这一般是一个结构体,内容根据你的需要自己定义
  17. -------------------------------------------------------------------------------}
  18. TMyRec=record
  19. Text:string;//结点显示的文本
  20. ImageIndex:Integer;//结点显示的图片索引。注意:要在结点显示图片必须TreeOptions.MiscOptions包含toCheckSuppot
  21. Id:string;//数据Id,可以为数据库记录的Id
  22. CheckType:TCheckType;//选择框类型
  23. CheckState:TCheckState;//选择框状态
  24. //...你还可以自己加
  25. end;
  26. {*------------------------------------------------------------------------------
  27. 定义一个上面结构体的指针类型,后面要用到这个东东
  28. -------------------------------------------------------------------------------}
  29. PMyRec=^TMyRec;
  30. TForm4=class(TForm)
  31. vsttree:TVirtualStringTree;
  32. il1:TImageList;
  33. advpmn1:TAdvPopupMenu;
  34. N1:TMenuItem;
  35. procedureFormCreate(Sender:TObject);
  36. procedurevsttreeGetText(Sender:TBaseVirtualTree;Node:PVirtualNode;
  37. Column:TColumnIndex;TextType:TVSTTextType;varCellText:WideString);
  38. procedurevsttreeInitNode(Sender:TBaseVirtualTree;ParentNode,
  39. Node:PVirtualNode;varInitialStates:TVirtualNodeInitStates);
  40. procedurevsttreeGetImageIndex(Sender:TBaseVirtualTree;Node:PVirtualNode;
  41. Kind:TVTImageKind;Column:TColumnIndex;varGhosted:Boolean;
  42. varImageIndex:Integer);
  43. procedureN1Click(Sender:TObject);
  44. procedurevsttreeFreeNode(Sender:TBaseVirtualTree;Node:PVirtualNode);
  45. procedurevsttreeGetPopupMenu(Sender:TBaseVirtualTree;Node:PVirtualNode;
  46. Column:TColumnIndex;constP:TPoint;varAskParent:Boolean;
  47. varPopupMenu:TPopupMenu);
  48. private
  49. {Privatedeclarations}
  50. public
  51. {Publicdeclarations}
  52. end;
  53. var
  54. Form4:TForm4;
  55. implementation
  56. {$R*.dfm}
  57. procedureTForm4.FormCreate(Sender:TObject);
  58. var
  59. RootNode,ChileNode:PVirtualNode;
  60. Data:PMyRec;
  61. begin
  62. //指定结点数据大小
  63. vsttree.NodeDataSize:=SizeOf(TMyRec);
  64. //指定树里要用的图片列表
  65. vsttree.Images:=il1;
  66. //添加根节点
  67. RootNode:=vsttree.AddChild(nil);
  68. Data:=vsttree.GetNodeData(RootNode);
  69. Data^.Text:='根结点';
  70. Data^.Id:='RootID';
  71. Data^.ImageIndex:=0;
  72. Data^.CheckType:=ctTriStateCheckBox;
  73. Data^.CheckState:=csUncheckedNormal;
  74. //添加一个子结点
  75. ChileNode:=vsttree.AddChild(RootNode);
  76. Data:=vsttree.GetNodeData(ChileNode);
  77. Data^.Text:='子结点1';
  78. Data^.Id:='ChildId1';
  79. Data^.ImageIndex:=1;
  80. Data^.CheckType:=ctTriStateCheckBox;
  81. Data^.CheckState:=csUncheckedNormal;
  82. //再添加一个子结点
  83. ChileNode:=vsttree.AddChild(RootNode);
  84. Data:=vsttree.GetNodeData(ChileNode);
  85. Data^.Text:='子结点2';
  86. Data^.Id:='ChildId2';
  87. Data^.ImageIndex:=1;
  88. Data^.CheckType:=ctTriStateCheckBox;
  89. Data^.CheckState:=csUncheckedNormal;
  90. //默认展开一级结点,这句话要写在初始的最后
  91. vsttree.Expanded[RootNode]:=True;
  92. {
  93. 注:在这里把数据添加进树后,树里并不能显示出结点
  94. 要在几个事件里写代码才行:
  95. OnInitNode:在这个事件里初始化结点,如指定复选框以及状态
  96. OnGetText:在这个事件里指定结点的显示文本
  97. OnGetPopupMenu:在这个事件里指定下拉菜单
  98. OnGetImageIndex:指定结点的图片索引
  99. OnFreeNode:释放结点时您要做的一些释放动作
  100. 通过这些事件,才能把结点的显示情况描述清楚。而您的
  101. 结构体是用来持有您每个结点的数据的。
  102. }
  103. end;
  104. //弹出菜单的点击事件
  105. procedureTForm4.N1Click(Sender:TObject);
  106. var
  107. CurrentNode:PVirtualNode;
  108. Data:PMyRec;
  109. Checked:string;
  110. begin
  111. {示例取点击结点的数据。
  112. 注意:TreeOptions.SelectionOptions必须包含toRightClickSelect
  113. }
  114. //取得当前选中结点
  115. CurrentNode:=vsttree.FocusedNode;
  116. ifAssigned(CurrentNode)then
  117. begin
  118. Data:=vsttree.GetNodeData(CurrentNode);
  119. ifCurrentNode.CheckState=csCheckedNormalthen
  120. begin
  121. Checked:='是';
  122. end
  123. else
  124. begin
  125. Checked:='否';
  126. end;
  127. ShowMessage('当前结点:'+#13
  128. +'Id='+Data^.Id+#13
  129. +'Text='+Data^.Text+#13
  130. +'是否选中='+Checked);
  131. end;
  132. end;
  133. procedureTForm4.vsttreeFreeNode(Sender:TBaseVirtualTree;Node:PVirtualNode);
  134. var
  135. Data:PMyRec;
  136. begin
  137. Data:=Sender.GetNodeData(Node);
  138. Finalize(Data^);
  139. end;
  140. procedureTForm4.vsttreeGetImageIndex(Sender:TBaseVirtualTree;
  141. Node:PVirtualNode;Kind:TVTImageKind;Column:TColumnIndex;
  142. varGhosted:Boolean;varImageIndex:Integer);
  143. var
  144. Data:PMyRec;
  145. begin
  146. Data:=Sender.GetNodeData(Node);
  147. ImageIndex:=Data^.ImageIndex;
  148. end;
  149. procedureTForm4.vsttreeGetPopupMenu(Sender:TBaseVirtualTree;
  150. Node:PVirtualNode;Column:TColumnIndex;constP:TPoint;
  151. varAskParent:Boolean;varPopupMenu:TPopupMenu);
  152. begin
  153. ifAssigned(Node)then
  154. begin
  155. PopupMenu:=advpmn1;
  156. end
  157. else
  158. begin
  159. PopupMenu:=nil;
  160. end;
  161. end;
  162. procedureTForm4.vsttreeGetText(Sender:TBaseVirtualTree;Node:PVirtualNode;
  163. Column:TColumnIndex;TextType:TVSTTextType;varCellText:WideString);
  164. var
  165. Data:PMyRec;
  166. begin
  167. Data:=Sender.GetNodeData(Node);
  168. CellText:=Data^.Text;
  169. end;
  170. procedureTForm4.vsttreeInitNode(Sender:TBaseVirtualTree;ParentNode,
  171. Node:PVirtualNode;varInitialStates:TVirtualNodeInitStates);
  172. var
  173. Data:PMyRec;
  174. begin
  175. Data:=Sender.GetNodeData(Node);
  176. Node.CheckType:=Data^.CheckType;
  177. Node.CheckState:=Data^.CheckState;
  178. end;
  179. end.
分享到:
评论
1 楼 Ti9eR 2012-06-16  
根节点左侧不显示CheckBox,需要如何设置呢?

相关推荐

Global site tag (gtag.js) - Google Analytics