窗口中放置了一个TREEVIEW,里面实现了类似于目录树一样的结构
如何将下级条目拖拽到其他条目下

解决方案 »

  1.   

    复制,移动TreeView节点    
        
    procedure AddSubTree(DestTree: TTreeView; SourceNode, DestNode: TTreeNode; AddState: Boolean);varTempNode, TempNode1: TTreeNode;I : integer;beginTempNode := DestNode;with DestTree do beginif Not (AddState) then TempNode := Items.AddChild(DestNode, sourceNode.Text);if SourceNode.HasChildren then beginfor I := 0 to SourceNode.Count-1 do beginif I>0 thenTempNode := Items.AddChild(TempNode.Parent, SourceNode.Item[I].Text)elseTempNode := 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);varTempLevel, TempIndex : integer;I, J : integer;TempNode : array of TTreeNode;TempNode1 : TTreeNode;Yes_No : Boolean;OldOnChanging, OldOnChanging1 : TTVChangingEvent;OldOnChange, OldOnChange1 : TTVChangedEvent;IsSelected : TTreeNode;beginOldOnChanging := 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 beginDestTreeView.Items[TempIndex].Delete;end;with SourceTreeView do beginTempNode[TempLevel] := Selected;if TempLevel>0 thenfor I := TempLevel-1 downto 0 do beginTempNode[I] := TempNode[I+1].Parent;end;end;with DestTreeView.Items do beginif Count>0 then beginfor I := TempLevel downto 0 dofor J := Count-1 downto 0 do beginif (TempNode[I].Text=DestTreeView.Items[J].Text) and (TempNode1=Nil) then beginif I=Templevel then Yes_no := True;TempNode1 := DestTreeView.Items[J];end;end;end;if TempNode1=Nil thenfor I := 0 to TempLevel-1 do beginTempNode1 := AddChild(TempNode1, TempNode[I].Text);endelsefor I := TempNode1.Level+1 to TempLevel-1 do beginTempNode1 := AddChild(TempNode1, TempNode[I].Text);end;end; AddSubTree(DestTreeView, IsSelected, TempNode1, False);//Yes_No);if (Not (Keep)) then beginif (IsSelected.Parent<>Nil) and (IsSelected.Parent.Count<1) thenIsSelected.Parent.DeleteelseIsSelected.Delete;end;DestTreeView.SortType := stData;DestTreeView.OnChanging := OldOnChanging;DestTreeView.OnChange := OldOnChange;SourceTreeView.OnChanging := OldOnChanging1;SourceTreeView.OnChange := OldOnChange1;end;