读书人

Virtual TreeView施用示例

发布时间: 2012-11-03 10:57:43 作者: rapoo

Virtual TreeView使用示例

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

Virtual TreeView施用示例

源码:

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

读书人网 >其他相关

热点推荐