小弟主要是想实现对应用程序的菜单项级别的权限控制,通过TreeView把菜单各项倒入到TreeView中,而每个节点上相应的都有CheckBox,可以选择,但小弟不知道如何将每个节点中的+ - 变为CheckBox,请各位多多指教,各位最好能把原码能给我一份,非常感谢!另外,我将我写的通过TreeView把菜单各项倒入到TreeView中的代码给大家看看,如何????procedure TForm1.Button3Click(Sender: TObject); //把菜单中所有项加入到Treeview1中
var 
i,j:integer; 
mynode:ttreenode; begin
        treeview1.items.Clear;
        with treeview1 do
                for I:= 0 to mainmenu1.Items.Count-1 do
                begin
                        mynode:=items.Add(nil,mainmenu1.items[i].Caption);
                        for j:=0 to mainmenu1.items[i].count-1 do
                        begin
                                Items.AddChild(mynode,mainmenu1.Items[i].Items[j].Caption);
                        end;
                end;
end;

解决方案 »

  1.   

    用第三方控件1stclass4000
    的fcTreeView可以达到你的效果,
    在网上可以很容易找到该控件
      

  2.   

    帮你顶下先
    同意楼上的
    或者尝试定义 一个类
    类中包含一个checkBox
    把类做为OBJECT 加入到TTREEVIEW中
      

  3.   

    我知道用第三方控件可以解决,但在Delphi中是否还有相类似的控件可以用呢,也就是除了TreeView外,还有其他的控件可以达到同样的效果呢?如果要向楼上的那位说的,尝试定义 一个类,那如何做呢?
      

  4.   

    每个节点上是checkbox,可以用imagelist实现啊。里面放两个图,一个没选中的,一个选中的。然后在选择节点的时候更换节点的imageindex就可以了。
      

  5.   

    我觉得 xixuemao(俺可是㊣②㈧经儿滴人) 说的方法好!赞同!
      

  6.   

    //TreeView不需要图片即可实现CheckBoxes
    //代码如下,至于其它点击事件的处理,应该比较简单unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, CommCtrl, StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        function IsNodeChecked(Node :TTreeNode) :Boolean;
      public
        { Public declarations }
      end;const
      TVIS_CHECKED = $2000;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      if (TreeView1.Selected = nil) then Exit;  ShowMessage('Node checked? ' + BoolToStr(IsNodeChecked(TreeView1.Selected), True));
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      dw: DWORD;
    begin
      //给TreeView加上CheckBoxes
      dw := GetWindowLong( TreeView1.Handle, GWL_STYLE);
      dw := dw or TVS_CHECKBOXES;
      SetWindowLong(TreeView1.Handle, GWL_STYLE , dw);
    end;procedure TForm1.Button2Click(Sender: TObject);
      //设置node的check状态
      procedure SetNodeChecked(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;
    begin
      if (TreeView1.Selected = nil) then Exit;  SetNodeChecked(TreeView1.Selected, not IsNodeChecked(TreeView1.Selected));
    end;//检查Node是否Checked
    function TForm1.IsNodeChecked(Node: TTreeNode): Boolean;
    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;end.