深入学习TTreeView组件
土著巫师 2006-01-05 09:10:02 最近在做一个小程序,里面用到TTreeView组件,本想这么一个常用组件不应该有什么问题;可是客户希望能够有CheckBox显示,其功能就象我们平时安装软件选择不同的部份一样,父节点可能有三态(选择,部份选择,没有选择);针对这种情况我就用了一个TImageList组件,里面放上三个图标分别代表选择,部份选择,没有选择状态,并且设置TreeView的StateImages为前面设置好的TImageList组件.可是怪事多多:
1、如果ImageList里的三个图标的下标从0,1,2计数,树显示时图形根本就显示不出来。后来在网上找了一个文章,说必须在0位置放一个不用的图标,我的图标为1,2,3序号,一试果然显示OK了。昏。
2、我是在TreeView的OnClick事件里,找到当前被选择的节点,然后改变这个节点的显示标图;如果MOUSE选中的是叶子节点(也就是它没有子节点了)图标改变了正常显示出来,可是如果选中的节点自身有子节点,怎么也改变不了它的StateIndex值(图标显示当然也不正常啦)。在程序中调试时发现给这个节点的StateIndex赋值不了。:( 更昏。
//---------------------------------------------------------------------------
//事先在设计器里建立了一个三层的树,点击第三层没问题,每二层和第一层都不行:(
//贴一部分代码出来(TreeView的OnClick事件):
void __fastcall TFormUser::tvGoodsGroupClick(TObject *Sender) //tvGoodsGroup为TreeView
{
TPoint Point;
GetCursorPos(&Point);
Point = tvGoodsGroup->ScreenToClient(Point);
if(tvGoodsGroup->GetHitTestInfoAt(Point.x, Point.y).Contains(htOnStateIcon))
ToggleTreeViewCheckBoxes(tvGoodsGroup->Selected);
}
//---------------------------------------------------------------------------
//改变节点StateIndex值函数,先定义了cCheckAll和cCheckNone为ImageList里图标的索引
void __fastcall TFormUser::ToggleTreeViewCheckBoxes(TTreeNode *Node)
{
if(Node)
{
if(!Node->HasChildren)
{
if(Node->StateIndex == cCheckNone) Node->StateIndex = cCheckAll; //ok
else Node->StateIndex = cCheckNone; //ok
}
else
{
//先判断原来的状态图标索引值
if(Node->StateIndex == cCheckAll) Node->StateIndex == cCheckNone;//改变不了,象没执行
else Node->StateIndex == cCheckAll;//改变不了,象没执行
}
}
}
//---------------------------------------------------------------------------
//“革命尚未成功,同志们尚需努力”,这么点事,不会要把VCL源代码拿出来瞧一瞧,重新写
//过吧。闷。超级闷。