复制和移动节点操作函数
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;
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;
解决方案 »
- 只知道窗口句柄,如何设置owner?
- 各位高手DevExpressVCL包怎么安装?
- 用Delphi7的 IdUDPServer控件出问题
- 如何检测电脑的网卡型号及已安装网卡的数量,并能对指定的网卡实行禁用
- 有句代码看不懂shellexecute(0,nil,pchar(k),nil,nil,sw_normal);
- 怎样使datagrid当前行整行带颜色,在线给分。。。。
- 记录调动
- FastReport中的frReport能实现自动纵向分页吗?如果不能有其他办法吗?Up有分!!!!
- 设备管理系统应如何入手,如何写计划?
- 各位Delphi同行,手上有Delphi6.0 的sp2吗?有的话,给我一个好吗?
- 有奖调查:C++ Builder,VC++,VB,Delphi我们该选择哪一个作为学习的方向?我现在很彷惶
- ●●● 招 聘 ●●●
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls,inifiles, ComCtrls, StdCtrls, ImgList, XPMenu,
ToolWin;type
TForm1 = class(TForm)
Panel1: TPanel;
TreeView1: TTreeView; ... private
{ Private declarations }
public { Public declarations }
end;
var
Form1: TForm1;
stanleyzhang:array[0..1000] of string;
stanleyphoenix:array[0..1000] of integer;
function savetree(treenodex:ttreenode):integer;
function pastetre(treenodey:ttreenode;treeviewy:ttreeview):integer;
implementation
{$R *.dfm}
function pastetree(treenodey:ttreenode;treeviewy:ttreeview):integer;
var
i:integer;
k:integer;
h:integer;
name:string; treenode:array[1..100] of ttreenode;
//////
x:integer;
phoenixlength:integer;
y:integer;
treeviewa:ttreeview;
t:ttreenode;
z:integer;
e:string;
mn:integer;
g:integer;
fathername:string;
sectionnum:array[0..1000] of string;
sectionname:string;
a:integer;
begin
y:=0;
mn:=2;
g:=1;
t:=treenodey;
h:=1;
result:=0; //将内存中的数据写到树上。
name:='';
i:=0;
treeviewa:=treeviewy;
name:=stanleyzhang[i];
sectionnum[0]:=name;
treenode[1]:=treeviewa.Items.AddChild(t,name);
i:=1;
while true do
begin
a:=0; if stanleyzhang[i]='' then
break
else
begin sectionname:=stanleyzhang[i];
for k:=0 to (h-1) do
if sectionnum[h]=sectionname then
begin
i:=i+1;
a:=1;
break;
end;
if a=1 then
break;
name:=stanleyzhang[i];
x:=stanleyphoenix[i];
phoenixlength:=length(inttostr(x));
////
while true do
begin
z:=stanleyphoenix[y];
if length(inttostr(z))=(phoenixlength-1) then
begin
e:=copy(inttostr(x),1,phoenixlength-1);
if (strtoint(e)=z) then
begin
//// fathername:=stanleyzhang[y];
while true do
begin
if fathername=treenode[g].Text then
begin break;
end;
g:=g+1;
end;
treenode[mn]:=treeviewa.items.AddChild(treenode[g],name);
sectionnum[h]:=name;
mn:=mn+1;
g:=1;
y:=0;
break;
///
end;
end;
y:=y+1; end; i:=i+1;
h:=h+1; end;
end;end;
var t:string;
treenode1:ttreenode;
v:integer;
treeroot:ttreenode;
q:integer;
r:integer;
w:integer;
treelast:ttreenode;
treenodey:ttreenode;
begin
result:=0;
v:=1;
t:='1';
q:=0;
w:=0;
///////将树写入内存。
treenodey:=treenodex;
treeroot:=treenodey;
treenode1:=treenodey;
stanleyzhang[0]:=treenode1.Text;
stanleyphoenix[0]:=1;
treelast:=treeroot;
while true do
begin
if treelast.HasChildren then
treelast:=treelast.GetLastChild
else
break;
end;while true do begin
while true do begin
if treenode1.HasChildren then
begin
treenode1:=treenode1.getFirstChild;
t:=t+inttostr(0)
end
else
break;
stanleyzhang[v]:=treenode1.Text;
stanleyphoenix[v]:=strtoint(t);
v:=v+1;
end; /////////////
r:=0;
while true do
begin if treelast.Text=stanleyzhang[r] then
begin
w:=1; break;
end;
r:=r+1; if stanleyzhang[r]='' then
break;
end;
if w=1 then
break;
///////////// if treenode1.Parent.GetLastChild=treenode1 then
begin
treenode1:=treenode1.Parent;
t:=copy(t,1,length(t)-1); end;
while true do
begin
if treenode1.Parent.Count=1 then
begin
treenode1:=treenode1.Parent;
t:=copy(t,1,length(t)-1)
end
else
break;
if treenode1=treeroot then
begin
q:=1;
break;
end;
end;
if q=1 then
break; treenode1:=treenode1.getNextSibling;
t:=inttostr(strtoint(t)+1);
stanleyzhang[v]:=treenode1.Text;
stanleyphoenix[v]:=strtoint(t);
v:=v+1; /////////////
r:=0;
while true do
begin
if treelast.Text=stanleyzhang[r] then
begin
w:=1; break;
end;
r:=r+1;
if stanleyzhang[r]='' then
break;
end;
if w=1 then
break;
/////////////
// end; end;
end;
这两个函数一个将树结点保存,一个是将树结点考到另一结点下。你定义以后,就调用吧。
type
TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
TreeView2: TTreeView;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}//生成结点
procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.Clear;
TreeView1.Items.AddChild(nil,'ROOT1');
TreeView1.Items.AddChildFirst(TreeView1.items[0],'First');
TreeView1.Items.AddChild(TreeView1.items[0],'Sencond');
TreeView1.Items.AddChild(TreeView1.items[0],'Third');
TreeView1.Items.AddChild(TreeView1.items[0],'Fourth');
TreeView1.Items.AddChild(nil,'ROOT2');
end;//移动结点
procedure TForm1.Button2Click(Sender: TObject);
begin
//下面这条语句是将ROOT1与子结点全部移至ROOT2结点下.
TreeView1.Items[0].MoveTo(TreeView1.items[5],naAddChild);
end;