最好是有源码的,非常感谢!不管有没有解决,下周五一定结贴。

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3531/3531089.xml?temp=.186947
      

  2.   

    http://search.csdn.net/Expert/topic/2137/2137712.xml?temp=.6334497------------------zt自上面的连接//参考如下代码~~
    uses CommCtrl;function TreeNodeGetChecked(mTreeNode: TTreeNode): Boolean;
    var
      vTVItem: TTVItem;
    begin
      Result := False;
      if not Assigned(mTreeNode) or not Assigned(mTreeNode.TreeView) then Exit;
      vTVItem.mask := TVIF_STATE;
      vTVItem.hItem := mTreeNode.ItemId;
      if TreeView_GetItem(mTreeNode.TreeView.Handle, vTVItem) then
        Result := (vTVItem.State and IndexToStateImageMask(2)) > 0; //0: None 1: False 2: True
    end; { TreeNodeGetChecked }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 }procedure TForm1.FormCreate(Sender: TObject);
    begin
      SetWindowLong(TreeView1.Handle, GWL_STYLE,
        GetWindowLong(TreeView1.Handle, GWL_STYLE) or TVS_CHECKBOXES);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      TreeNodeSetChecked(TreeView1.Selected, True);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      TreeNodeSetChecked(TreeView1.Selected, False);
    end;procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if htOnStateIcon in TreeView1.GetHitTestInfoAt(X, Y) then
        Caption := BoolToStr(TreeNodeGetChecked(TreeView1.GetNodeAt(X, Y)), True)
        //TODO -oZswang -c事件 : 触发点击选择框
      else Caption := '';
    end;procedure TForm1.Button3Click(Sender: TObject);
    var
      I: Integer;
    begin
      Memo1.Clear;
      for I := 0 to TreeView1.Items.Count - 1 do
        if TreeNodeGetChecked(TreeView1.Items[I]) then
          Memo1.Lines.Add(TreeView1.Items[I].Text);
    end;
      

  3.   

    1stClass 4000 在www.51delphi.com有下载
      

  4.   

    TdxTreeView控件能满足你的要求
      

  5.   

    TCheckTreeNode = class(TTreeNode)
      private
        FChecked: Boolean;
        procedure SetChecked(const Value: Boolean);
      public
        property Checked: Boolean read FChecked write SetChecked;
      end;  TCheckTreeView = class(TTreeView)
      protected
        procedure CreateWnd; override;
        procedure CreateCheckNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
      end;procedure TCheckTreeNode.SetChecked(const Value: Boolean);
      function TreeNodeSetChecked(mTreeNode: TCheckTreeNode; mChecked: Boolean): Boolean;
      var
        vTVItem: TTVItem;
      begin
        Result := False;
        if not Assigned(mTreeNode) then Exit;    FillChar(vTVItem, SizeOf(vTVItem), 0);
        with vTVItem do
        begin
          hItem := mTreeNode.ItemId;
          mask := TVIF_STATE;
          StateMask := TVIS_STATEIMAGEMASK;
          State := IndexToStateImageMask(Succ(Ord(mChecked)));
          Result := TreeView_SetItem(mTreeNode.Handle, vTVItem);
        end;
      end;  procedure pSelect(mTreeNode: TCheckTreeNode; mChecked: Boolean);
      var
        I: Integer;
      begin
        for I := 0 to mTreeNode.Count - 1 do
          TCheckTreeNode(mTreeNode[I]).Checked := mChecked;
      end;  procedure pSelectYes(mTreeNode: TCheckTreeNode);
      begin
        if Assigned(mTreeNode.Parent) then
          if not TCheckTreeNode(mTreeNode.Parent).Checked then
          begin
            TreeNodeSetChecked(TCheckTreeNode(mTreeNode.Parent), True);
            TCheckTreeNode(mTreeNode.Parent).FChecked := True;
          end;
      end;  procedure pSelectNo(mTreeNode: TCheckTreeNode);
      var
        I: Integer;
      begin
        if Assigned(mTreeNode.Parent) and TCheckTreeNode(mTreeNode.Parent).Checked then
        begin
          for I := 0 to mTreeNode.Parent.Count - 1 do
            if TCheckTreeNode(mTreeNode.Parent[I]).Checked then Exit;
          TCheckTreeNode(mTreeNode.Parent).Checked := False;
        end;
      end;
    begin
      FChecked := Value;
      TreeNodeSetChecked(Self, Value);
      pSelect(Self, Value);
      if Value
      then pSelectYes(Self)
      else pSelectNo(Self);
    end;procedure TCheckTreeView.CreateWnd;
    begin
      inherited CreateWnd;
      SetWindowLong(Handle, GWL_STYLE,
        GetWindowLong(Handle, GWL_STYLE) or TVS_CHECKBOXES);
    end;procedure TCheckTreeView.CreateCheckNodeClass(Sender: TCustomTreeView;
      var NodeClass: TTreeNodeClass);
    begin
      NodeClass := TCheckTreeNode;
    end;
      

  6.   

    谢谢各位的答复,我在程序中大量使用了DXTREEVIEW控件,如果在这个控件上实现就最好了,我不用换控件了。请 trainbox(rain)老兄详细说明一下使用方法好吗?非常感谢!