饥荒中庭boss怎么召唤:delphi treeview节点移动函数

来源:百度文库 编辑:偶看新闻 时间:2024/03/29 15:58:39

//TreeView节点移动函数,支撑同级移动跟任意移动。up代表移动方向,true上移false下移;
//同级移动的时候须要传进选中节点的level,免意挪动level=-1
procedure UpDownNode(node:TTreeNode;up:boolean;level:integer);
var TargetNode: TTreeNode;
begin
  if (level<>-1) then //同级间移动
  begin
    if (node <>nil)then //检查是否有选中节点 如果有则做上移操作
    begin
      if (up) then //上移
      begin
        if (node.GetPrev <> nil) then
        begin
          TargetNode := node.GetPrev;
          while TargetNode.Level <> level do
          begin
            if TargetNode.GetPrev=nil then
              break
            else
              TargetNode := TargetNode.GetPrev;
          end;
          if (TargetNode<>nil) then
          begin
            if (TargetNode.Level=level) then
            begin
              if (node.getPrevSibling <> nil) then //检查是否有同级上一节点如果有做上移操作
              begin
                if (node.getPrevSibling <> nil) then
                  node.MoveTo(TargetNode,naInsert)
                else
                  node.MoveTo(TargetNode,naAddFirst);
              end else
              begin
                node.MoveTo(TargetNode,naAdd);
              end;
            end;
          end;
        end;
      end else //下移
      begin
        if (node.GetNext <> nil) then
        begin
          TargetNode := node.getNext;
          while TargetNode.Level <> level do
          begin
            if TargetNode.GetNext=nil then
              break
            else
              TargetNode := TargetNode.getNext;
          end;
          if (TargetNode<>nil) then
          begin
            if (TargetNode.Level=level) then
            begin
              if (node.getNextSibling <> nil) then //检讨是否有同级上一节点假如有作上移操作
              begin
                if (TargetNode.getNextSibling <> nil) then
                  node.MoveTo(TargetNode.getNextSibling,naInsert)
                else
                  node.MoveTo(TargetNode,naAdd);
              end else
              begin
                node.MoveTo(TargetNode,naInsert);
              end;
            end;
          end;
        end;
      end;
    end;
  end else //容许跨级移动
  begin
    if (node <> nil)then //检讨是否有选中节点 假如有则做上移操作
    begin
      if (up) then //上移
      begin
        if (node.GetPrev <> nil) then
        begin
          TargetNode := node.GetPrev;
          if (TargetNode<>nil) then
          begin
            if (node.GetPrev <> nil) then //检查是否有同级上一节点如果有做上移操作
            begin
              if (node.GetPrev <> nil) then
                node.MoveTo(TargetNode,naInsert)
              else
                node.MoveTo(TargetNode,naAddFirst);
            end else
            begin
              node.MoveTo(TargetNode,naAdd);
            end;
          end;
        end;
      end else //下移
      begin
        if (node.GetNext <> nil) then
        begin
          TargetNode := node.GetNext;
          while TargetNode.Parent = node do
          begin
            if TargetNode.GetNext=nil then
              break
            else
              TargetNode := TargetNode.getNext;
          end;
          if (TargetNode<>nil) then
          begin
            if (node.GetNext <> nil) then //检讨是否有共级上一节点假如有干上移操息
            begin
              if (TargetNode.getNext <> nil) then
                  node.MoveTo(TargetNode.getNext,naInsert)
                else
                  node.MoveTo(TargetNode,naAdd);
            end else
            begin
              node.MoveTo(TargetNode,naAdd);
            end;
          end;
        end;
      end;
    end;
  end;
end;