给 TTreeView 添加复选框

  1 //1.引用单元
  2 uses Commctrl ;
  3
  4 //2.定义私有过程
  5   procedure tvToggleCheckbox(TreeView: TTreeView;Node: TTreeNode;isclick:boolean =false);
  6   procedure SetChecked(Node: TTreeNode; Checked: Boolean);
  7   function IsChecked(Node: TTreeNode): Boolean;
  8
  9 //3.过程体代码
 10 //检查某个节点是否被 选中
 11 function TForm1.IsChecked(Node: TTreeNode): Boolean;
 12 var
 13   TvItem :TTVItem;
 14 begin
 15   TvItem.Mask := TVIF_STATE;
 16   TvItem.hItem := Node.ItemId;
 17   TreeView_GetItem(Node.TreeView.Handle, TvItem);
 18   Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;
 19 end;
 20 //让 某个节点被 选中
 21 procedure TForm1.SetChecked(Node: TTreeNode; Checked: Boolean);
 22 var
 23 TvItem :TTVItem;
 24 begin
 25   FillChar(TvItem, SizeOf(TvItem), 0);
 26   with TvItem do
 27   begin
 28     hItem := Node.ItemId;
 29     Mask := TVIF_STATE;
 30     StateMask := TVIS_STATEIMAGEMASK;
 31     if Checked then
 32       TvItem.State :=TVIS_CHECKED
 33     else
 34       TvItem.State :=TVIS_CHECKED shr 1;
 35     TreeView_SetItem(Node.TreeView.Handle, TvItem);
 36   end;
 37 end;
 38 // 对节点中所有 子节点 都 选中或 未选中 状态
 39 procedure TForm1.tvToggleCheckbox(TreeView: TTreeView;
 40 Node: TTreeNode ;isclick :boolean=false);
 41 var CurNode, ParentNode, GrandSonNode,sonNode: TTreeNode;
 42 flg1: boolean;
 43 begin
 44   CurNode :=node;
 45   with TreeView do
 46   begin
 47     if IsChecked(CurNode) then //
 48     begin
 49       sonNode := CurNode.GetFirstChild; //遍历子树,选中 则子节点 全部 为选中;
 50       while sonNode<>nil do
 51       begin
 52         SetChecked(sonNode, true);
 53         tvToggleCheckbox(TreeView,sonNode,true);
 54         sonNode := sonNode.GetNextSibling;
 55       end;
 56       ParentNode:= CurNode.Parent; //父;
 57       if ParentNode<>nil then
 58       begin
 59         if not isChecked(parentNode) then
 60         begin
 61           GrandSonNode := ParentNode.GetFirstChild; //遍历子树;
 62           flg1 := false;
 63           while GrandSonNode<>nil do
 64           begin
 65             if (not IsChecked(GrandSonNode)) then //true,有未选中
 66             flg1 := true;
 67             if flg1 then //已有、退出loop;
 68             GrandSonNode := nil
 69             else
 70             GrandSonNode := GrandSonNode.GetNextSibling;
 71           end;
 72           SetChecked(ParentNode, not flg1);
 73           tvToggleCheckbox(TreeView,ParentNode,false);
 74         end;
 75       end; // end parentNode 不等于空
 76     end
 77     else if not IsChecked(CurNode) then
 78     begin
 79       ParentNode := CurNode.Parent; //父;
 80       if ParentNode<>nil then
 81       begin
 82         if isChecked(parentNode) then
 83         begin
 84           SetChecked(ParentNode, false);
 85           tvToggleCheckbox(TreeView,ParentNode);
 86         end;
 87       end; //end parentnode
 88       if (isclick) then
 89       begin
 90         sonNode := CurNode.GetFirstChild; //遍历子树,未选中 则子节点 全部 为未选中;
 91         while sonNode<>nil do
 92         begin
 93           SetChecked(sonNode, false);
 94           tvToggleCheckbox(TreeView,sonNode,true);
 95           sonNode := sonNode.GetNextSibling;
 96         end;
 97       end;
 98     end;
 99   end;
100 end;
101
102 //4.点击连选处理
103 procedure TForm1.TreeView1Click(Sender: TObject);
104 var
105   P:TPoint;
106   treenode :TTreeNode;
107 begin
108   GetCursorPos(P);
109   P := TreeView1.ScreenToClient(P);
110   if (htOnStateIcon in TreeView1.GetHitTestInfoAt(P.X,P.Y)) then
111   begin
112     treenode := TreeView1.GetNodeAt(P.X,P.Y);
113     tvToggleCheckbox(TreeView1,treenode ,true);
114   end;
115 end;
116
117 //5.生成节点
118 procedure TForm1.FormCreate(Sender: TObject);
119 begin
120   //仅仅这一句话就能让treeview 显示复选框
121   SetWindowLong(TreeView1.Handle, GWL_STYLE, GetWindowLong(TreeView1.Handle, GWL_STYLE) or $00000100);
122 //  SetWindowLong(H, GWL_STYLE, GetWindowLong(H, GWL_STYLE) or TVS_CHECKBOXES);  //这名同上一个意思
123   {下面的代码只是给 TreeView 添加内容}
124   with TreeView1 do
125   begin
126      Align := alLeft;
127      Items.Add(nil, ‘AAA‘);
128      Items.Add(nil, ‘BBB‘);
129      Items.Add(nil, ‘CCC‘);
130      Items.AddChild(Items[2], ‘111‘);
131      Items.AddChild(Items[2], ‘222‘);
132      Items.AddChild(Items[2], ‘333‘);
133   end;
134 end;
135
136 //6.查看是否选中
137 procedure TForm1.Button1Click(Sender: TObject);
138 var
139   Node: TTreeNode;
140   TVI: TTVItem;
141 begin
142   for Node in TreeView1.Items do
143   begin
144     TVI.mask := TVIF_STATE;
145     TVI.hItem := Node.ItemId;
146     TreeView_GetItem(TreeView1.Handle, TVI);
147     if TVI.state and $2000 = $2000 then
148       ShowMessage(Node.Text);
149   end;
150 end; 
时间: 2024-09-28 18:53:36

给 TTreeView 添加复选框的相关文章

学习 TTreeView [16] - 给 TTreeView 添加复选框 (回复 &quot;丁永其&quot; 的问题)

问题来源: http://www.cnblogs.com/del/archive/2008/05/15/1114450.html#1199402 本例效果图: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, ComCtrls, StdCtrls; type   TForm1 = class(TForm)     Tr

组合框里添加复选框的方法(使用勾选的假象,用图片代替而已,并非QT原生支持)

组合框可以看作是列表框和文本框的组合,因其占据的空间少,使用操作方便,常被界面设计人员用于界面开发设计中,在有限个输入的条件下,组合框常用来代替文本框,这样从用户使用角度来看,更趋人性化,所见即所得.然好的控件永远敢不上应用的步伐,有时常规控件并不能满足应用的需要,经常需要在现有的控件上做扩展.有些应用需要在组合框的列表框的每一项前加复选框,以便可以控制列表框每一项的状态(选中还是未选中),显然现有的组合框(列表框+文本框的组合)不能满足应用要求.那么怎么得到一个超强组合框(列表框+文本框+复选

QListWidget的QComboBox下拉列表添加复选框及消息处理

要在QComboBox下拉列表项中添加复选框,并进行消息处理,在网上搜索了很久没有找到太多有用的信息和实际的例子,但从中还是找到了一些提示性的资料,根据这些简短的介绍,最终实现了这个功能. QComboBox有一个setView的方法,因此,可以自定义的一个视图类,将复选框在视图中实现,本例自定义视图类继承于QListWidget,因为在该视图类中,有一个setItemWidget方法,可以直接将QCheckBox附加在QListWidgetItem项上. 具体看下面得的示例: //QCombo

ajax动态添加复选框

1 function getLands() { 2 3 $.ajax({ 4 url:"httpserver.do?doPost&userQygs="+$("#userQygs").val(), 5 type:"POST", 6 dataType:"text", 7 8 success:function(data){ 9 10 if(data==null||data==""){ 11 12 aler

dojo:为数据表格添加复选框

一.添加复选框 此时应该选用EnhancedGrid,而不是普通的DataGrid.添加复选框需要设置EnhancedGrid的plugins属性,如下: gridLayout =[{ defaultCell: { type: cells._Widget, styles: 'text-align: center;' }, cells: [ { name: "WBS", field: "wbsCode", width: "60px"}, { nam

C#ListView控件添加复选框并获取选中的数目

1.添加复选框:listView1.CheckBoxes = true; 2.选中listview并获取选中的数目: private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e) { e.Item.Selected = e.Item.Checked; m = listView1.CheckedItems.Count; label1.Text = "当前选中数:" + m.ToString(); } 说

DateGridView标题列头添加复选框

第一:添加列标题时,添加两个空格--用于显示复选框: 第二:实现列标题添加复选框,代码如下: private void AddCheckeBoxToDGVHeader(DataGridView dgv) { for (int i = 0; i < this.dgvList.Columns.Count; i++) { System.Windows.Forms.CheckBox ckBox = new System.Windows.Forms.CheckBox(); //ckBox.Text = &qu

Js动态添加复选框Checkbox的实例方法!!!

首先,使用JS动态产生Checkbox可以采用如下类似的语句: var checkBox=document.createElement("input"); checkBox.setAttribute("type","checkbox"); checkBox.setAttribute("id",'123456'); 但是,这样产生的checkbox是不带尾后的文字的,如果需要添加,那么需要使用 document.createTe

dev 表格添加复选框 ,可以勾选多行

this.repositoryItemCheckEdit1.QueryCheckStateByValue += new DevExpress.XtraEditors.Controls.QueryCheckStateByValueEventHandler(re3_QueryCheckStateByValue); //判断表格的数据勾选复选框 void re3_QueryCheckStateByValue(object sender, DevExpress.XtraEditors.Controls.