VirtualStringTree+

(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。

posted on 2011-05-07 09:25  xxmcu  阅读(996)  评论(0编辑  收藏  举报

导航