树操作的简便过程

来源:互联网 发布:网吧服务器攻击软件 编辑:程序博客网 时间:2024/04/29 23:01

为了使繁杂的树操作变得简单,特此写了以下这个单元。为了节省时间,这个单元没有面向对象,而仅仅是通过过程来实现的,它可以被使用在任何版本的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.

原创粉丝点击