您现在的位置:首页 >> VCL >> VCL >> 内容

Delphi中VirtualStringTree使用心得

时间:2011/9/3 16:25:18 点击:

  核心提示:(1)这是一个可扩展到多层的树视图。视图就是单纯显示,无法与传入数据自动同步,必须手动写。(2)无论父节点还是子节点,传入数据必须是一个相同的结构(record),存放在其data属性里,通过“指针:...
(1) 这是一个可扩展到多层的树视图。视图就是单纯显示,无法与传入数据自动同步,必须手动写。 
  (2) 无论父节点还是子节点,传入数据必须是一个相同的结构(record),存放在其data属性里,通过“指针:=GetNodeData(节点)”获得地址,传入传出其“指针^.各结构属性”。 
  (3) 控件从RootNodeCount:=根节点数目大于0开始激发,立即激发onGetNodeDataSize,来获得传入结构数据的大小,此处可以返回sizeof(结构类型)。 
  (4) 然后对每个节点(包括已激发的子节点)进行OnInitNode,此处可以可以直接修改节点的属性,并用(2)的方法传入其data,以备以后调用。 
  (5) InitNode时,可以Include(InitialStates, ivsHasChildren)来说明含有字节点,但不会加载子节点。 
    如要加载,可以(1)界面直接双击打开,或者(2)代码Include(InitialStates, ivsExpanded) 
    亦可(3)直接调用ReinitChildren[父节点],(4)直接设置Sender.ChildCount[父节点],来加载。 
    此时会激发onInitChildren,事件中可以设置ChildCount,然后对每一个子节点,一一激发InitNode。 
  (6) 每个节点激发(InitNode)后,会激发GetText,用于显示文本。此处可以根据Column来分别返回CellText。 
  (7) 如果某个节点Checktype设为ctCheckbox,则该节点前会增加check框,其值通过CheckState设定。 
  (8) 【bug】如果同为ctCheckbox,父子节点的CheckState是不关联的,也就是说,点选父节点,下属子节点一个也不会改变选值。 
    如需同步,就要在onCheck中用代码实现。我在本unit内,实现了 
      (a)父节点选中,则全部子节点也选中 
      (b)子节点全部选中,则父节点也选中 
      ©子节点全部选空,则父节点也选空 
    即使onChecked事件即使加入了父子节点Checked同步代码,因为InitNode时不加载Child,未扩展开的子节点是无法调用onChecked代码与父节点同步的。 
    所以千万注意InitNode时,要用Sender.ReinitChildren(Node,True);先履一遍字节点。 
  (9) VirtualStringTree各个事件内,许多Node参数不是“var”返回值的,所以对它们赋值于事无补。 
    如需要,最好使用“VirtualStringTree.各属性[节点]:=值”,具体值是否返回,可以查看VirtualStringTree源码。 
  (10)onGetImageIndex获得每个节点的图标,要搭配TImagelist控件;onGetHint获得每个节点的Hint。 

作者:沈闻天 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
本类推荐
  • 没有
本类固顶
  • 没有
  • 盒子文章(www.2ccc.com) © 2020 版权所有 All Rights Reserved.
  • 沪ICP备05001939号