就像是金山毒霸中用于选择磁盘目录

解决方案 »

  1.   

    自己从TREEview继承,写一个组件,加入Check功能。
      

  2.   

    呵其实你通过图片也可以实现的,设置节点的选中图片与未选中图片为CheckBox的两种状态的图片不就OK了!简单又实用!
      

  3.   

    重载TreeView的CreateParams:typeTCheckBoxTreeView = class(TTreeView)protectedprocedure CreateParams(var Params: TCreateParams); override;end;procedure TCheckBoxTreeView.CreateParams(var Params: TCreateParams);begininherited;Params.Style:=Params.Style or TVS_CHECKBOXES;{ TVS_CHECKBOXES declared in CommCtrl }end;如果要Check这个CheckBox,可以用下面的代码:function IsNodeChecked(Node :TTreeNode) :Boolean;constTVIS_CHECKED = $2000;varTvItem :TTVItem;beginTvItem.Mask := TVIF_STATE;TvItem.hItem := Node.ItemId;TreeView_GetItem(Node.TreeView.Handle, TvItem);Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;end;procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);constTVIS_CHECKED = $2000;varTvItem :TTVItem;beginFillChar(TvItem, SizeOf(TvItem), 0);with TvItem do beginhItem := Node.ItemId;Mask := TVIF_STATE;StateMask := TVIS_STATEIMAGEMASK;if Checked thenTvItem.State :=TVIS_CHECKEDelseTvItem.State :=TVIS_CHECKED shr 1;TreeView_SetItem(Node.TreeView.Handle, TvItem);end;end;可以做成事件和封装成一个类:private OldState :Boolean;procedure Change(Node: TTreeNode); override;begininherited Change(Node);OldState := IsNodeChecked(Node);end;procedure Click; override;varNewState :Boolean;begininherited Click;NewState := IsNodeChecked(Self.Selected);if NewState = OldState then Exit;if (NewState) and Assigned(OnNodeChecked) then OnNodeChecked()else if (not NewState) and Assigned(OnNodeUnChecked) thenOnNodeUnChecked()// OnNodeChecked & OnNodeUnchecked will be events that you declareend;                                    ----我有源码,可以发给你!