RT

解决方案 »

  1.   

    delphi什么版本,自带treeview有复选框?
      

  2.   


    用这个构建复选框的:
       SetWindowLong(GroupTree.Handle, GWL_STYLE, GetWindowLong(GroupTree.Handle, GWL_STYLE) or $00000100);
      

  3.   

    function   TreeNodeSetChecked(mTreeNode:   TTreeNode;   mChecked:   Boolean):   Boolean;
    var
        vTVItem:   TTVItem;
        Template:integer;
    begin
        Result   :=   False;
        if   not   Assigned(mTreeNode)   or   not   Assigned(mTreeNode.TreeView)   then   Exit;   
        
        vTVItem.mask   :=   TVIF_STATE;   
        vTVItem.hItem   :=   mTreeNode.ItemId;   
        TreeView_GetItem(mTreeNode.TreeView.Handle,   vTVItem);   
        if   not   TreeView_GetItem(mTreeNode.TreeView.Handle,   vTVItem)   then   Exit;   
        vTVItem.stateMask   :=   TVIS_STATEIMAGEMASK;   
        vTVItem.state   :=   IndexToStateImageMask(Succ(Ord(mChecked)));   
        Result   :=   TreeView_SetItem(mTreeNode.TreeView.Handle,   vTVItem);   
    end;   {   TreeNodeSetChecked   }
      

  4.   

    完全的如下:
    procedure TFrmMain.DOYNChecked(Node: TTreeNode; isChecked: Boolean; CoustomTreeView:TTreeView);//操作节点是否被checkd
    var
      item:TTVItem;
    begin
    //  FrmExplain.Memo1.Lines.Append(inttostr(Node.AbsoluteIndex));
      item.mask:=TVIF_HANDLE;
      item.hItem:=CoustomTreeView.Items[Node.AbsoluteIndex].ItemId;
      TreeView_GetItem(CoustomTreeView.Handle,item);
      item.mask:=TVIF_HANDLE or TVIF_STATE;
      if not isChecked then
        item.state:= (item.state or $1000) and (not $2000)
      else
        item.state:= (item.state or $2000) and (not $1000);
      item.stateMask:=$ffffffff;
      TreeView_SetItem(CoustomTreeView.Handle,item);
    end;procedure TFrmMain.SetParentChecked(Node: TTreeNode; CoustomTreeView:TTreeView);//当子节点checked时,设置父节点应该设置的checked
    begin
      if Node.Parent <> nil then
      begin
        if isBrotherAllChecked(Node, CoustomTreeView) then
          DOYNChecked(Node.Parent, True, CoustomTreeView);
        SetParentChecked(Node.Parent, CoustomTreeView);
      end;
    end;procedure TFrmMain.SetChecked(Node: TTreeNode; Checked: Boolean);
    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;
    function TFrmMain.isBrotherAllChecked(Node: TTreeNode; CoustomTreeView:TTreeView): Boolean;//判断所有的兄弟节点是否已全部被checkd
    var
      CurChild: TTreeNode;
      tmpBool: Boolean;
    begin
    //  Node := Node.Parent;
    //  if Node.HasChildren then
    //  begin    CurChild:=Node;//.GetFirstChild;
        if CurChild <> nil then
        begin
          tmpBool := IsNodeChecked(CurChild, CoustomTreeView);
          if not tmpBool then
          begin
            Result := False;
            exit;
          end;
          CurChild:=Node.getNextChild(CurChild);
        end;
    //  end;
      Result := True;
    end;function TFrmMain.IsNodeChecked(Node :TTreeNode; CoustomTreeView:TTreeView) :Boolean;//判断节点是否被checkd
    var
      item:TTVItem;
    begin
      item.mask:=TVIF_HANDLE;
      item.hItem:=CoustomTreeView.Items[Node.AbsoluteIndex].ItemId;
      TreeView_GetItem(CoustomTreeView.Handle,item);
      if (item.state and $2000)=0 then
         Result := False
       else
         Result := True;
    end;procedure TFrmMain.AllChildYNChecked(Node: TTreeNode; isChecked: Boolean; CoustomTreeView:TTreeView);//操作所有的子节点是否被checkd
    var
      CurChild: TTreeNode;
    begin
      if Node.HasChildren then
      begin
        CurChild:=Node.GetFirstChild;
        while CurChild <> nil do
        begin
          DOYNChecked(CurChild, isChecked, CoustomTreeView);
          if CurChild.HasChildren then
          begin
            AllChildYNChecked(CurChild, isChecked, CoustomTreeView);
          end;
          CurChild:=Node.getNextChild(CurChild);
        end;
      end;
    end;procedure TFrmMain.SetParentNOChecked(Node: TTreeNode; CoustomTreeView:TTreeView);//当子节点not checked时,设置父节点应该设置的checked
    begin
      if Node.Parent <> nil then
      begin
     //   DOYNChecked(Node.Parent, False);
        SetParentNOChecked(Node.Parent, CoustomTreeView);
      end;
    end;
    procedure TFrmExplain.SetComCtlStyle(Ctl: TWinControl; Value: Integer; UseStyle: Boolean);
    var
      Style: Integer;
    begin
      if Ctl.HandleAllocated then
      begin
        Style := GetWindowLong(Ctl.Handle, GWL_STYLE);
        if not UseStyle then Style := Style and not Value
        else Style := Style or Value;
        SetWindowLong(Ctl.Handle, GWL_STYLE, Style);
      end;
    end;
    建完树后,加一句
    SetComCtlStyle(TreeView1,TVS_CHECKBOXES,True);
      

  5.   

    看来不少人这样使用带选框的treeview
    我使用的时候发现,如果移动过一个节点后,它的选框就会消失!
    不知道大家有没有遇到过这种情况,算不算bug。。