为了使繁杂的树操作变得简单,特此写了以下这个单元。为了节省时间,这个单元没有面向对象,而仅仅是通过过程来实现的,它可以被使用在任何版本的Delphi,从而完成简便的树操作
- unit TreeCtrls;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs,ComCtrls;
- function NodeMoveUp(TreeNode: TTreeNode): boolean;
- function NodeMoveDown(TreeNode: TTreeNode): boolean;
- function NodeDelete(TreeNode:TTreeNode;Hint,Title:string;Form:TForm):boolean;
- function NodeAddLast(Tree:TTreeview;NodeName:string):boolean;
- function NodeAddFirst(Tree:TTreeview;NodeName:string):boolean;
- function NodeAddChildLast(Tree:TTreeview;NodeName:string):boolean;
- function NodeAddChildFirst(Tree:TTreeview;NodeName:string):boolean;
- function GetAllChild(TreeNode:TTreeNode;Item:TStrings):boolean;
- implementation
- //结点向上移
- function NodeMoveUp(TreeNode: TTreeNode): boolean;
- begin
- if TreeNode=nil then
- begin
- result:=false;
- exit;
- end;
- //如果已是最上面的结点
- if TreeNode.getPrevSibling = nil then
- begin
- result := false;
- exit;
- end;
- //如果上一个结点是父结点
- if treenode.GetPrev=treenode.Parent then
- begin
- result:=false;
- exit;
- end;
- //正常情况
- treenode.MoveTo(treenode.getPrevSibling,nainsert);
- result:=true;
- end;
- //结点向下移
- function NodeMoveDown(TreeNode: TTreeNode): boolean;
- var
- TempNode:TTreeNode;
- begin
- if TreeNode=nil then
- begin
- result:=false;
- exit;
- end;
- //如果已是最后一个结点
- if TreeNode.getNextSibling = nil then
- begin
- result := false;
- exit;
- end;
- //如果是倒数第二个结点
- if treenode.getNextSibling.getNextSibling=nil then
- begin
- TempNode:=treenode.getNextSibling;
- NodeMoveUp(TempNode);
- result:=true;
- exit;
- end;
- //正常情况
- Treenode.MoveTo(treenode.getNextSibling.getNextSibling,nainsert);
- result:=true;
- end;
- //删除结点
- function NodeDelete(TreeNode:TTreeNode;Hint,Title:string;Form:TForm):boolean;
- var
- Res:integer;
- begin
- if TreeNode=nil then
- begin
- result:=false;
- exit;
- end;
- //如果包含子结点
- if treenode.HasChildren=true then
- begin
- messagebox(form.Handle,'该目录包含有子目录,不能删除','提示',MB_OK);
- result:=false;
- exit;
- end;
- RES:=messagebox(form.Handle,pchar(hint),pchar(title),MB_YESNO);
- if Res=6 then
- begin
- treenode.Delete;
- result:=true;
- end
- else
- begin
- result:=false;
- end;
- end;
- //添加(父)同级结点到末尾
- function NodeAddLast(Tree:TTreeview;NodeName:string):boolean;
- begin
- try
- tree.Items.Add(tree.Selected,NodeName);
- except
- begin
- result:=false;
- exit;
- end;
- end;
- result:=true;
- end;
- //添加(父)同级结点到首位
- function NodeAddFirst(Tree:TTreeview;NodeName:string):boolean;
- begin
- try
- tree.Items.AddFirst(tree.Selected,NodeName);
- except
- begin
- result:=false;
- exit;
- end;
- end;
- result:=true;
- end;
- //添加(子)同级结点到末尾
- function NodeAddChildLast(Tree:TTreeview;NodeName:string):boolean;
- begin
- try
- tree.Items.AddChild(tree.Selected,NodeName);
- except
- begin
- result:=false;
- exit;
- end;
- end;
- result:=true;
- end;
- //添加(子)同级结点到首位
- function NodeAddChildFirst(Tree:TTreeview;NodeName:string):boolean;
- begin
- try
- tree.Items.AddChildFirst(tree.Selected,NodeName);
- except
- begin
- result:=false;
- exit;
- end;
- end;
- result:=true;
- end;
- //遍历所有子结点
- function GetAllChild(TreeNode:TTreeNode;Item:TStrings):boolean;
- var
- ND:TTreeNode;
- ChildNum:integer;
- i:integer;
- begin
- if TreeNode=nil then
- begin
- result:=false;
- exit;
- end;
- if TreeNode.HasChildren=true then
- begin
- ChildNum:=treenode.Count;
- ND:=treenode.getFirstChild;
- for i:=1 to ChildNum do
- begin
- item.Add(nd.Text);
- nd:=nd.getNextSibling;
- end;
- result:=true;
- end
- else
- result:=false;
- end;
- end.