递归法选取树子节点 + 控件拖放 适合N层树,通用 unit treeRecursion; { 标题: 递归法选取树子节点 + 控件拖放 作者: vigor 时间: 2004.3.26 } interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls, ComCtrls, ExtCtrls; type TForm1 = class(TForm) TreeView1: TTreeView; ListBox1: TListBox; Splitter1: TSplitter; procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer); private { Private declarations } public { Public declarations } procedure AddSelectedChildrenToListbox(tree : TTreeView;startNode :TTreeNode;listBox :TListBox); end; var Form1: TForm1; g_startNode : TTreeNode; implementation {$R *.dfm} { 拖放控件 准备条件: 源控件 DragKind :=dkDrag; DragCursor :=crDefalt; DragMode := dmManual; 目标控件 实施步骤: 1. 开始拖动操作 onMouseDown BeginDrag ( 源控件 ) 2. 接收拖动项目 OnDragOver (目标控件) 3. 放下拖动项目 OnDragDrop (目标控件) 4. 终止拖动操作 OnEndDrag ( 源控件 ) } procedure TForm1.AddSelectedChildrenToListbox(tree: TTreeView; startNode: TTreeNode; listBox: TListBox); var curParent : TTreeNode; begin if not(tree.Selected.HasChildren) then begin if listBox.Items.IndexOf(Trim(tree.Selected.Text)) = -1 then listBox.Items.Add(Trim(tree.Selected.Text)); end else begin tree.Selected := tree.Selected.GetNext; while tree.Selected<>nil do begin curParent := tree.Selected;//保护现场^^ AddSelectedChildrenToListbox(tree,tree.Selected,listBox); tree.Selected := curParent.getNextSibling;//恢复现场^^ end; end; end; procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin g_startNode := TreeView1.GetNodeAt(X,Y); if Assigned(g_startNode) then TreeView1.BeginDrag(True); end; end; procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source = TreeView1 then Accept := True; end; procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer); begin if Source = TreeView1 then begin AddSelectedChildrenToListbox(treeview1,g_startNode,listbox1); end; end; end.
|