在TreeView组件中怎么实现类似CheckBox的功能。在DbGrid组件中怎么实现CheckBox的功能。
也就是每行中显示类似TCheckBox的功能,如果数据库中有Boolean类型的数据,
DbGrid中也应随着数据的变化而显示选取或者未选取的状态。

解决方案 »

  1.   


    在 TreeView 中添加一个 CheckBox
    可以用变通的手法。    TreeView 有 Images 属性不是吗?自己做三张小图片 : 全选中、部分选中、不选状态 ( 直接拍下 CheckBox 三种状态的图片在加工一下就可以了 ),然后在点击事件中根据具体情况设置 TTreeNodes 的 ImageIndex 就 OK 了。   如果嫌麻烦的话就去 Down 一个控件 ,其实有些控件也是这样做的 ,界面上你是看不出来的 .     :)**************Manan Patel <[email protected]>重载 TreeView 的 CreateParams:type  TCheckBoxTreeView = class(TTreeView)  protected    procedure CreateParams(var Params: TCreateParams); override;  end;
    procedure TCheckBoxTreeView.CreateParams(var Params: TCreateParams);begin  inherited;  Params.Style:=Params.Style or TVS_CHECKBOXES;  { TVS_CHECKBOXES declared in CommCtrl }end;
    如果要 Check 这个 CheckBox,可以用下面的代码 :function IsNodeChecked(Node :TTreeNode) :Boolean;const  TVIS_CHECKED = $2000;var  TvItem :TTVItem;begin  TvItem.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);const  TVIS_CHECKED = $2000;var  TvItem :TTVItem;begin  FillChar(TvItem, SizeOf(TvItem), 0);  with TvItem do begin    hItem     := Node.ItemId;    Mask      := TVIF_STATE;    StateMask := TVIS_STATEIMAGEMASK;    if Checked then      TvItem.State :=TVIS_CHECKED    else      TvItem.State :=TVIS_CHECKED shr 1;    TreeView_SetItem(Node.TreeView.Handle, TvItem);  end;end;可以做成事件和封装成一个类 :private OldState :Boolean;
    procedure Change(Node: TTreeNode); override;begin  inherited Change(Node);  OldState := IsNodeChecked(Node);end;
    procedure Click; override;var  NewState :Boolean;begin  inherited 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;
      

  2.   

    我不明白楼上的,能否实现,我自己也做了一个,象瑞星那样的,还有你说的,DBGrid,你需要自己重新绘制,你可以跟我联系,[email protected]
      

  3.   

    建议楼主用第三方控件,当然自己要写也可以,但比较麻烦,比如在定位,还有众多checkbox的动态创建,写的好固然好,如果安排不好,效果还不如用第三方控件。
    dbgrid中加选择框也可以不要重绘的,把combox与dbgrid分别处理也可以达到这样的效果。
      

  4.   

    niu2008() 的方法是比较好的,是用了WINDOWS COMMON CONTROL中Tree view 的TVS_CHECKBOXES风格而已,在MSDN上自己看看就明的了