var xx,xxx:TTreeNode;循环执行: xx:=TreeView1.Items.AddChild(nil,yy);//xx为该父节点点,yy为父节点的显示字符串针对某个父接点xx: 循环执行: xxx:=TreeView1.AddChild(xx,yyy);//xxx为该子节点,yyy为子节点的显示字符串依次类推
看明白下面的过程,您的treeview水平也可以算中等了 复制,移动TreeView节点 -------------------------------------------------------------------------------- procedure AddSubTree(DestTree: TTreeView; SourceNode, DestNode: TTreeNode; AddState: Boolean); var TempNode, TempNode1: TTreeNode; I : integer; begin TempNode := DestNode; with DestTree do begin if Not (AddState) then TempNode := Items.AddChild(DestNode, sourceNode.Text); if SourceNode.HasChildren then begin for I := 0 to SourceNode.Count-1 do begin if I>0 then TempNode := Items.AddChild(TempNode.Parent, SourceNode.Item[I].Text) else TempNode := Items.AddChild(TempNode, SourceNode.Item[I].Text); AddSubTree(DestTree, SourceNode.Item[I], TempNode, True); end; end; end; end;procedure MoveSubTreeView(SourceTreeView, DestTreeView: TTreeView; Keep: Boolean); var TempLevel, TempIndex : integer; I, J : integer; TempNode : array of TTreeNode; TempNode1 : TTreeNode; Yes_No : Boolean; OldOnChanging, OldOnChanging1 : TTVChangingEvent; OldOnChange, OldOnChange1 : TTVChangedEvent; IsSelected : TTreeNode; begin OldOnChanging := DestTreeView.OnChanging; DestTreeView.OnChanging := Nil; OldOnChange := DestTreeView.OnChange; DestTreeView.OnChange := Nil; OldOnChanging1 := SourceTreeView.OnChanging; SourceTreeView.OnChanging := Nil; OldOnChange1 := SourceTreeView.OnChange; SourceTreeView.OnChange := Nil; IsSelected := SourceTreeView.Selected; TempLevel := SourceTreeView.Selected.Level; setlength(TempNode, TempLevel+1); Yes_No := False; TempNode1 := Nil; TempIndex := FindNode(DestTreeView, SourceTreeView.Selected.Text); if TempIndex>-1 then begin DestTreeView.Items[TempIndex].Delete; end; with SourceTreeView do begin TempNode[TempLevel] := Selected; if TempLevel>0 then for I := TempLevel-1 downto 0 do begin TempNode[I] := TempNode[I+1].Parent; end; end; with DestTreeView.Items do begin if Count>0 then begin for I := TempLevel downto 0 do for J := Count-1 downto 0 do begin if (TempNode[I].Text=DestTreeView.Items[J].Text) and (TempNode1=Nil) then begin if I=Templevel then Yes_no := True; TempNode1 := DestTreeView.Items[J]; end; end; end; if TempNode1=Nil then for I := 0 to TempLevel-1 do begin TempNode1 := AddChild(TempNode1, TempNode[I].Text); end else for I := TempNode1.Level+1 to TempLevel-1 do begin TempNode1 := AddChild(TempNode1, TempNode[I].Text); end; end; AddSubTree(DestTreeView, IsSelected, TempNode1, False);//Yes_No); if (Not (Keep)) then begin if (IsSelected.Parent<>Nil) and (IsSelected.Parent.Count<1) then IsSelected.Parent.Delete else IsSelected.Delete; end; DestTreeView.SortType := stData; DestTreeView.OnChanging := OldOnChanging; DestTreeView.OnChange := OldOnChange; SourceTreeView.OnChanging := OldOnChanging1; SourceTreeView.OnChange := OldOnChange1; end;
给你看我写的一个过程,应该不难看懂吧!可以支持多层! {绘制树: QryObj:查询控件名称;MyTreeView:树型控件名;SQL:查询语句; Field:主字段;Index:图片索引 } procedure DrawTree(ChildQryObj,GrandsonQryObj:TADOQuery;MyTreeView:TTreeView;LayerNum,MainIndex,ChildIndex,GrandsonIndex:Integer;ChildSQL,GrandsonSQL,ChildField,ChildGrandsonField,GrandsonField:string); var MainNode,ChildNode,GrandsonNode,lnNode:TTreeNode; begin with MyTreeView.Items do begin Clear; MainNode:=add(nil,'信息名称列表'); MainNode.ImageIndex:=MainIndex; MainNode.SelectedIndex:=MainIndex; DateSelect(ChildQryObj,ChildSQL); while not ChildQryObj.Eof do begin ChildNode:= AddChild(MainNode,ChildQryObj.fieldbyname(''+ChildField+'').AsString); ChildNode.ImageIndex:=ChildIndex; ChildNode.SelectedIndex :=ChildIndex; if LayerNum>2 then begin DateSelect(GrandsonQryObj,GrandsonSQL+''''+ChildNode.Text+''''); while not GrandsonQryObj.Eof do begin GrandsonNode:=AddChild(ChildNode,GrandsonQryObj.fieldbyname(''+GrandsonField+'').AsString ); GrandsonNode.ImageIndex :=GrandsonIndex; GrandsonNode.SelectedIndex :=GrandsonIndex; GrandsonQryObj.Next; end; lnNode := GetFirstNode; while not (lnNode = nil) do begin lnNode.Expand(true); lnNode := lnNode.GetNextSibling; end; end; ChildQryObj.Next; end; end; end;
var xx,xxx:TTreeNode;循环执行: xx:=TreeView1.Items.AddChild(nil,yy);//xx为该父节点点,yy为父节点的显示字符串针对某个父接点xx: 循环执行: xxx:=TreeView1.AddChild(xx,yyy);//xxx为该子节点,yyy为子节点的显示字符串依次类推
var nodecel : array[0..10] of TtreeNode; sqlstr,s1,s2:string; tempstr :array[0..10] of string; tempBoolean :array[0..10] of Boolean; Nodetitle :TtreeNode; begin if (xlmc.text='') or (wz.text='') then begin exit; end; screen.Cursor:=crHourGlass; if Sender<>cmdok then key.Text:='0'; TreeView1.Items.Clear; TreeView1.Items.BeginUpdate; new(nodeid); dispose(nodeid); nodecel[0] := TreeView1.Items.AddFirst (nil, xlmc.text); nodecel[0].ImageIndex := 0; nodecel[0].SelectedIndex := 3; if wz.text<>'全部' then sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,id from 绿化档案 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' and 位置='''+wz.text+''' order by 首桩号,首桩米,尾桩号,尾桩米' else sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,绿化档案.位置,id from 绿化档案 INNER JOIN lib_位置 ON 绿化档案.位置 = lib_位置.位置 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' order by 首桩号,首桩米,尾桩号,尾桩米,lib_位置.序号'; ADODataSet1.commandtext:=sqlstr; ADODataSet1.open; while not ADODataSet1.eof do begin tempBoolean[1]:=false; s1:=ADODataSet1.FieldByName('首桩号').AsString; s2:=ADODataSet1.FieldByName('首桩米').AsString; if ADODataSet1.FieldByName('首桩米').asinteger=0 then sqlstr:= s1 else if ADODataSet1.FieldByName('首桩米').asinteger>0 then sqlstr:= s1 +'(+'+s2+')' else sqlstr:= s1 +'('+s2+')'; sqlstr:= sqlstr+'--'; s1:=ADODataSet1.FieldByName('尾桩号').AsString; s2:=ADODataSet1.FieldByName('尾桩米').AsString; if ADODataSet1.FieldByName('尾桩米').asinteger=0 then sqlstr:= sqlstr+s1 else if ADODataSet1.FieldByName('尾桩米').asinteger>0 then sqlstr:= sqlstr+s1 +'(+'+s2+')' else sqlstr:= sqlstr+s1 +'('+s2+')'; if wz.text='全部' then begin if (tempstr[1] <>sqlstr) then begin tempstr[1] :=sqlstr; nodecel[1] := TreeView1.Items.AddChild(nodecel[0], tempstr[1]); nodecel[1].ImageIndex := 1; nodecel[1].SelectedIndex := 3; end; new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger; Nodetitle :=TreeView1.Items.AddChildObject(nodecel[1], ADODataSet1.FieldByName('位置').AsString,nodeid); Nodetitle.ImageIndex := 2; Nodetitle.SelectedIndex := 3; end else begin if (tempstr[1] <>sqlstr) then new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger; Nodetitle :=TreeView1.Items.AddChildObject(nodecel[0], sqlstr,nodeid); Nodetitle.ImageIndex := 2; Nodetitle.SelectedIndex := 3; end; ADODataSet1.Next; end; nodecel[0].Expanded := True; ADODataSet1.close; ADODataSet1.CursorLocation:=clUseClient; ADODataSet1.CursorType:=ctDynamic; ADODataSet1.LockType:=ltOptimistic; TreeView1.Items.endUpdate; screen.Cursor:=crDefault;
begin
Node:= treeview1.items.addchild(nil,'hello');
//子节点
treeview1.items.addchild(node,'hello1');
Node1:= treeview1.items.addchild(nil,'hello');
treeview1.items.AddChild(treeview1.Items.ITEM[1],'hello2');
treeview1.items.AddChild(treeview1.Items.ITEM[1],'hello3');
treeview1.items.AddChild(treeview1.Items.ITEM[2],'hello4');
xx,xxx:TTreeNode;循环执行:
xx:=TreeView1.Items.AddChild(nil,yy);//xx为该父节点点,yy为父节点的显示字符串针对某个父接点xx:
循环执行:
xxx:=TreeView1.AddChild(xx,yyy);//xxx为该子节点,yyy为子节点的显示字符串依次类推
复制,移动TreeView节点
--------------------------------------------------------------------------------
procedure AddSubTree(DestTree: TTreeView; SourceNode, DestNode: TTreeNode; AddState: Boolean);
var
TempNode, TempNode1: TTreeNode;
I : integer;
begin
TempNode := DestNode; with DestTree do begin
if Not (AddState) then TempNode := Items.AddChild(DestNode, sourceNode.Text);
if SourceNode.HasChildren then begin
for I := 0 to SourceNode.Count-1 do begin
if I>0 then
TempNode := Items.AddChild(TempNode.Parent, SourceNode.Item[I].Text)
else
TempNode := Items.AddChild(TempNode, SourceNode.Item[I].Text);
AddSubTree(DestTree, SourceNode.Item[I], TempNode, True);
end;
end;
end;
end;procedure MoveSubTreeView(SourceTreeView, DestTreeView: TTreeView; Keep: Boolean);
var
TempLevel, TempIndex : integer;
I, J : integer;
TempNode : array of TTreeNode;
TempNode1 : TTreeNode;
Yes_No : Boolean;
OldOnChanging, OldOnChanging1 : TTVChangingEvent;
OldOnChange, OldOnChange1 : TTVChangedEvent;
IsSelected : TTreeNode;
begin
OldOnChanging := DestTreeView.OnChanging;
DestTreeView.OnChanging := Nil;
OldOnChange := DestTreeView.OnChange;
DestTreeView.OnChange := Nil;
OldOnChanging1 := SourceTreeView.OnChanging;
SourceTreeView.OnChanging := Nil;
OldOnChange1 := SourceTreeView.OnChange;
SourceTreeView.OnChange := Nil; IsSelected := SourceTreeView.Selected;
TempLevel := SourceTreeView.Selected.Level;
setlength(TempNode, TempLevel+1);
Yes_No := False;
TempNode1 := Nil; TempIndex := FindNode(DestTreeView, SourceTreeView.Selected.Text);
if TempIndex>-1 then begin
DestTreeView.Items[TempIndex].Delete;
end; with SourceTreeView do begin
TempNode[TempLevel] := Selected;
if TempLevel>0 then
for I := TempLevel-1 downto 0 do begin
TempNode[I] := TempNode[I+1].Parent;
end;
end; with DestTreeView.Items do begin
if Count>0 then begin
for I := TempLevel downto 0 do
for J := Count-1 downto 0 do begin
if (TempNode[I].Text=DestTreeView.Items[J].Text) and (TempNode1=Nil) then begin
if I=Templevel then Yes_no := True;
TempNode1 := DestTreeView.Items[J];
end;
end;
end; if TempNode1=Nil then
for I := 0 to TempLevel-1 do begin
TempNode1 := AddChild(TempNode1, TempNode[I].Text);
end
else
for I := TempNode1.Level+1 to TempLevel-1 do begin
TempNode1 := AddChild(TempNode1, TempNode[I].Text);
end;
end;
AddSubTree(DestTreeView, IsSelected, TempNode1, False);//Yes_No);
if (Not (Keep)) then begin
if (IsSelected.Parent<>Nil) and (IsSelected.Parent.Count<1) then
IsSelected.Parent.Delete
else
IsSelected.Delete;
end; DestTreeView.SortType := stData; DestTreeView.OnChanging := OldOnChanging;
DestTreeView.OnChange := OldOnChange;
SourceTreeView.OnChanging := OldOnChanging1;
SourceTreeView.OnChange := OldOnChange1;
end;
{绘制树:
QryObj:查询控件名称;MyTreeView:树型控件名;SQL:查询语句;
Field:主字段;Index:图片索引
}
procedure DrawTree(ChildQryObj,GrandsonQryObj:TADOQuery;MyTreeView:TTreeView;LayerNum,MainIndex,ChildIndex,GrandsonIndex:Integer;ChildSQL,GrandsonSQL,ChildField,ChildGrandsonField,GrandsonField:string);
var
MainNode,ChildNode,GrandsonNode,lnNode:TTreeNode;
begin
with MyTreeView.Items do
begin
Clear;
MainNode:=add(nil,'信息名称列表');
MainNode.ImageIndex:=MainIndex;
MainNode.SelectedIndex:=MainIndex;
DateSelect(ChildQryObj,ChildSQL);
while not ChildQryObj.Eof do
begin
ChildNode:= AddChild(MainNode,ChildQryObj.fieldbyname(''+ChildField+'').AsString);
ChildNode.ImageIndex:=ChildIndex;
ChildNode.SelectedIndex :=ChildIndex;
if LayerNum>2 then
begin
DateSelect(GrandsonQryObj,GrandsonSQL+''''+ChildNode.Text+'''');
while not GrandsonQryObj.Eof do
begin
GrandsonNode:=AddChild(ChildNode,GrandsonQryObj.fieldbyname(''+GrandsonField+'').AsString );
GrandsonNode.ImageIndex :=GrandsonIndex;
GrandsonNode.SelectedIndex :=GrandsonIndex;
GrandsonQryObj.Next;
end;
lnNode := GetFirstNode;
while not (lnNode = nil) do
begin
lnNode.Expand(true);
lnNode := lnNode.GetNextSibling;
end;
end;
ChildQryObj.Next;
end;
end;
end;
xx,xxx:TTreeNode;循环执行:
xx:=TreeView1.Items.AddChild(nil,yy);//xx为该父节点点,yy为父节点的显示字符串针对某个父接点xx:
循环执行:
xxx:=TreeView1.AddChild(xx,yyy);//xxx为该子节点,yyy为子节点的显示字符串依次类推
nodecel : array[0..10] of TtreeNode;
sqlstr,s1,s2:string;
tempstr :array[0..10] of string;
tempBoolean :array[0..10] of Boolean;
Nodetitle :TtreeNode;
begin
if (xlmc.text='') or (wz.text='') then begin exit;
end;
screen.Cursor:=crHourGlass;
if Sender<>cmdok then
key.Text:='0';
TreeView1.Items.Clear;
TreeView1.Items.BeginUpdate;
new(nodeid);
dispose(nodeid);
nodecel[0] := TreeView1.Items.AddFirst (nil, xlmc.text);
nodecel[0].ImageIndex := 0;
nodecel[0].SelectedIndex := 3;
if wz.text<>'全部' then
sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,id from 绿化档案 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' and 位置='''+wz.text+''' order by 首桩号,首桩米,尾桩号,尾桩米'
else
sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,绿化档案.位置,id from 绿化档案 INNER JOIN lib_位置 ON 绿化档案.位置 = lib_位置.位置 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' order by 首桩号,首桩米,尾桩号,尾桩米,lib_位置.序号';
ADODataSet1.commandtext:=sqlstr;
ADODataSet1.open;
while not ADODataSet1.eof do
begin
tempBoolean[1]:=false;
s1:=ADODataSet1.FieldByName('首桩号').AsString;
s2:=ADODataSet1.FieldByName('首桩米').AsString;
if ADODataSet1.FieldByName('首桩米').asinteger=0 then
sqlstr:= s1
else
if ADODataSet1.FieldByName('首桩米').asinteger>0 then
sqlstr:= s1 +'(+'+s2+')'
else
sqlstr:= s1 +'('+s2+')';
sqlstr:= sqlstr+'--';
s1:=ADODataSet1.FieldByName('尾桩号').AsString;
s2:=ADODataSet1.FieldByName('尾桩米').AsString;
if ADODataSet1.FieldByName('尾桩米').asinteger=0 then
sqlstr:= sqlstr+s1
else
if ADODataSet1.FieldByName('尾桩米').asinteger>0 then
sqlstr:= sqlstr+s1 +'(+'+s2+')'
else
sqlstr:= sqlstr+s1 +'('+s2+')';
if wz.text='全部' then
begin
if (tempstr[1] <>sqlstr) then
begin
tempstr[1] :=sqlstr;
nodecel[1] := TreeView1.Items.AddChild(nodecel[0], tempstr[1]);
nodecel[1].ImageIndex := 1;
nodecel[1].SelectedIndex := 3;
end;
new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger;
Nodetitle :=TreeView1.Items.AddChildObject(nodecel[1], ADODataSet1.FieldByName('位置').AsString,nodeid);
Nodetitle.ImageIndex := 2;
Nodetitle.SelectedIndex := 3;
end
else
begin
if (tempstr[1] <>sqlstr) then
new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger;
Nodetitle :=TreeView1.Items.AddChildObject(nodecel[0], sqlstr,nodeid);
Nodetitle.ImageIndex := 2;
Nodetitle.SelectedIndex := 3;
end;
ADODataSet1.Next;
end;
nodecel[0].Expanded := True;
ADODataSet1.close;
ADODataSet1.CursorLocation:=clUseClient;
ADODataSet1.CursorType:=ctDynamic;
ADODataSet1.LockType:=ltOptimistic;
TreeView1.Items.endUpdate;
screen.Cursor:=crDefault;