unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, Grids; type TForm1 = class(TForm) tv1: TTreeView; Button1: TButton; Button2: TButton; tv2: TTreeView; Button3: TButton; Button4: TButton; StringGrid1: TStringGrid; mmo1: TMemo; Button5: TButton; Button6: TButton; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure tv1Change(Sender: TObject; Node: TTreeNode); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} {节点转移} var IsNode1 : Boolean = True;{全局变量,判断节点在哪个控件里面} procedure TForm1.Button1Click(Sender: TObject); begin if IsNode1 then //判断是否转移过 begin if Boolean(tv1.Items.Count) then //节点不为空 begin tv2.Items := tv1.Items; tv1.Items.Clear; IsNode1 := False; //是否转移的标志物 end; end else //二次转移 if Boolean(tv2.Items.Count) then //节点不为空 begin tv1.Items := tv2.Items; tv2.Items.Clear; IsNode1 := True; end; end; {添加节点} procedure TForm1.Button2Click(Sender: TObject); var CurrNode: TTreeNodes;//节点数组 TemNode: TTreeNode; //临时节点 begin CurrNode := tv1.Items;//关联树形控件1 {添加一级节点} TemNode := CurrNode.Add(nil, '一级001');//add增加兄弟节点 CurrNode.Add(TemNode, '一级002'); CurrNode.Add(TemNode, '一级003'); {添加二级节点} TemNode := CurrNode.AddChild(TemNode, '二级001');//AddChild增加子节点 CurrNode.Add(TemNode, '二级002'); CurrNode.Add(TemNode, '二级003'); {添加三级节点} TemNode := CurrNode.AddChild(TemNode, '三级001'); CurrNode.Add(TemNode, '三级002'); CurrNode.Add(TemNode, '三级003'); {添加四级节点} TemNode := CurrNode.AddChild(TemNode, '四级001'); CurrNode.Add(TemNode, '四级002'); CurrNode.Add(TemNode, '四级003'); CurrNode.AddFirst(TemNode, '四级No1'); //AddFirst增加兄弟节点,排兄弟最前 end; {遍历读取每一项} var I : Integer = 0; procedure TForm1.Button3Click(Sender: TObject); begin Self.Button3.Caption := tv1.Items.Item[i].Text; //按钮输出 if i < tv1.Items.Count-1 then Inc(i) else i := 0;{tv1.Items.Count为总项数} tv1.SetFocus; //获取焦点 tv1.Select(tv1.Items.Item[i]);//选中该项 {读取每一项方法2: procedure TForm1.Button3Click(Sender: TObject); var CurrNode : TTreeNodes; //节点数组 TemNode : TTreeNode;//单个节点 begin CurrNode := tv1.Itemsl//节点 TemNode := CurrNode[I]; Self.Button3.Caption := tv1.Items.Item[i].Text; //按钮输出 if i < tv1.Items.Count-1 then Inc(i) else i := 0;//tv1.Items.Count为总项数 tv1.SetFocus; //获取焦点 tv1.Select(TemNode);//选中该项 end;} end; {清空TTreeList} procedure TForm1.Button4Click(Sender: TObject); begin tv1.Items.Clear; tv2.Items.Clear; end; {读取数据} procedure TForm1.Button5Click(Sender: TObject); var i: Integer; begin mmo1.Clear; for i := 0 to tv1.Items.Count - 1 do//遍历每一项 mmo1.Lines.Add(tv1.Items[i].Text);//插入 end; {按级别读取数据} procedure TForm1.Button6Click(Sender: TObject); var i: Integer; s: string; begin mmo1.Clear; for i := 0 to tv1.Items.Count - 1 do //遍历 begin s := StringOfChar(#32, tv1.Items[i].Level*4);//读取级别,多少级就多少个 s := s + tv1.Items[i].Text; mmo1.Lines.Add(s); end; end; {初始化} procedure TForm1.FormCreate(Sender: TObject); begin {初始化 StringGrid1} with StringGrid1 do begin //Align := alClient; //FixedRows := 0;//固定住行避免被改变 ColCount := 2;//列数 ColWidths[0] := 80;//第一列宽度 ColWidths[1] := 60;//第二列宽度 DefaultRowHeight := 18; //每个框的高度 RowCount := 15; //有15行 Cells[0,0] := '当前选择'; Cells[0,1] := '序号'; Cells[0,2] := '所在级别'; Cells[0,3] := '在兄弟中排行'; Cells[0,4] := '下级总数'; Cells[0,5] := '上级元素'; Cells[0,6] := '上一个'; Cells[0,7] := '下一个'; Cells[0,8] := '上一个兄弟'; Cells[0,9] := '下一个兄弟'; Cells[0,10] := '上一个可见'; Cells[0,11] := '下一个可见'; Cells[0,12] := '第一个下级'; Cells[0,13] := '最后一个下级'; Cells[0,14] := '总数'; end; end; {读取每个节点的内容} procedure TForm1.tv1Change(Sender: TObject; Node: TTreeNode); begin with StringGrid1 do begin {清除第二列的数据} StringGrid1.Cols[1].Clear; {当前选择} Cells[1,0] := Node.Text; {序号; AbsoluteIndex 是绝对序号} Cells[1,1] := IntToStr(Node.AbsoluteIndex); {所在级别} Cells[1,2] := IntToStr(Node.Level); {在兄弟中排行} Cells[1,3] := IntToStr(Node.Index); {下级总数} Cells[1,4] := IntToStr(Node.Count); {上级元素} if Boolean(Node.Parent) then Cells[1,5] := Node.Parent.Text; {上一个} if Boolean(Node.GetPrev) then Cells[1,6] := Node.GetPrev.Text; {下一个} if Boolean(Node.GetNext) then Cells[1,7] := Node.GetNext.Text; {上一个兄弟} if Boolean(Node.getPrevSibling) then Cells[1,8] := Node.getPrevSibling.Text; {下一个兄弟} if Boolean(Node.getNextSibling) then Cells[1,9] := Node.getNextSibling.Text; {上一个可见} if Boolean(Node.GetPrevVisible) then Cells[1,10] := Node.GetPrevVisible.Text; {下一个可见} if Boolean(Node.GetNextVisible) then Cells[1,11] := Node.GetNextVisible.Text; {第一个下级} if Node.HasChildren then Cells[1,12] := Node.getFirstChild.Text; {最后一个下级} if Node.HasChildren then Cells[1,13] := Node.GetLastChild.Text; {总数} Cells[1,14] := IntToStr(Node.Owner.Count); end; end; end.