Listview有一Checkboxes属性,设置为TRUE就会显示出一个CHECKBOX

解决方案 »

  1.   

    干嘛要用两个菜单?一个类似Listview或scrollbox上加上3个checkbox来给用户选择属性
    ---------------------------------------------------------------
    图层     可视              可编辑           可选
    ---------------------------------------------------------------河流     checkbox[1]      checkbox[2]       checkbox[3]
    道路     checkbox[1]      checkbox[2]       checkbox[3]
      

  2.   

    可以的,确定rect范围,然后将checkbox的boundsrect属性为你指定的rect范围就可以了。
      

  3.   

    可以的,确定rect范围,然后将checkbox的boundsrect属性为你指定的rect范围就可以了。
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      R : TRect;
      Widths : array of Integer;
      I,Count : Integer;
      CheckBox : TCheckBox;
      CheckBox1: TCheckBox;
    begin
      Count := ListView1.Columns.Count;
      SetLength(Widths,Count);
      for I := 0 to Count -1 do
        Widths[I] := ListView1.Columns[I].Width;
      R := self.ListView1.Items[1].DisplayRect(drBounds);  R.Left := widths[1] + 2;
      Dec(R.Bottom,2);
      Dec(R.Top,2);
      R.Right := Widths[0] + widths[1] - 2;
      CheckBox := TCheckBox.Create(Self);
      CheckBox.Parent := ListView1;
      CheckBox.BoundsRect := R;
      R.Left := widths[0] + widths[1] + 2;
      R.Right := widths[0] + widths[1] + widths[2] - 2;
      CheckBox1 := TCheckBox.Create(self);
      CheckBox1.Parent := ListView1;
      CheckBox1.BoundsRect := R;
    end;
    这是个非常简单的例子,实际上我把R的范围硬性编码了,这样不好,你修改一下,最好将代码放到OnDraw事件中去。
      

  5.   

    这样可以加上CheckBox,但CheckBox我怎么与listview的item对应呢?
      

  6.   

    例:
    TTreeView的结点如何具有CheckBox?
    TreeView有个Images属性,做三张小图片:
    全选中、部分选中、不选状态(直接拍下CheckBox三种状态的图片在加工一下就可以了),然后在点击事件中根据具体情况设置TTreeNodes的ImageIndex就OK了。
    重载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) then 
    OnNodeUnChecked()// OnNodeChecked & OnNodeUnchecked will be events that you declare
    end;
      

  7.   

    Params.Style:=Params.Style or TVS_CHECKBOXES;是什么意思啊?
    谁能帮我解释一下上面例子。我有好多不懂。
    我再加100分求上面treeview的解释。up
      

  8.   


    直接设置TreeView的节点TreeNode的StateImageIndex就可以了。它对应的StateImages为一个TImageList,且里面有三张图片,分别表达选中,部分选中,不选中三种状态即可。//设置一个节点的状态为选中TreeNode := TreeView.Selected;
    if TreeNode <> nil then
      node.StateIndex  := 0;//同样可以设置为不选中TreeNode := TreeView.Selected;
    if TreeNode <> nil then
      node.StateIndex  := 2;//部分选中TreeNode := TreeView.Selected;
    if TreeNode <> nil then
      node.StateIndex  := 1;很简单吧!如果不想用StateImages(有时候可能看起来不大漂亮),也可以用ImageIndex和SelectedIndex.注意控制就可以了。
      

  9.   

    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) then 
    OnNodeUnChecked()// OnNodeChecked & OnNodeUnchecked will be events that you declare
    end;
    谁能帮我解释一下?另有高分相送。
      

  10.   

    procedure CreateParams(var Params: TCreateParams); override;
    重载了创建参数,其他的几个接口很简单阿!很容易懂的,
    function IsNodeChecked(Node :TTreeNode) :Boolean;
    检测节点是否被选中,
    procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);
    设置节点的选择状态!
      

  11.   

    楼上的有几个帖子都贴串了
    人家问的是listview,你们却贴treeview的。
      

  12.   

    不知道您说的是接口的使用还是,接口的实现(对不起先在把方法都说成接口了,确切的说应该是方法 method 不是interface),方法的实现其实看看代码不是很难的,几个参数是windows常用控件(不是windows标准控件)进行事件传递的和样式设定的,是windows自我定义的但是前体是win95以后的win32平台!
    使用简单使用就行了!
      

  13.   

    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;
      

  14.   

    非常同意sundayboys(sunboy) 的观点,控件的定位
    这样可以做很多的有趣东西!!!