递归法选取树子节点 + 控件拖放
适合N层树,通用
.pas
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.
.dfm
object Form1: TForm1
Left = 210
Top = 148
Width = 602
Height = 480
Caption = '递归法选取树子节点+ 控件拖放'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Splitter1: TSplitter
Left = 273
Top = 0
Height = 446
end
object TreeView1: TTreeView
Left = 0
Top = 0
Width = 273
Height = 446
Align = alLeft
DragCursor = crMultiDrag
Indent = 19
ReadOnly = True
TabOrder = 0
OnMouseDown = TreeView1MouseDown
Items.Data = {
020000001D0000000000000000000000FFFFFFFFFFFFFFFF0000000003000000
04B2E9D1AF270000000000000000000000FFFFFFFFFFFFFFFF00000000000000
000ED1A7D4D3B7D1C3F7CFB8B2E9D1AF270000000000000000000000FFFFFFFF
FFFFFFFF00000000000000000ECAD5B7D1C8D5B1A8B1EDB2E9D1AF2100000000
00000000000000FFFFFFFFFFFFFFFF000000000300000008CDB3BCC6B2E9D1AF
250000000000000000000000FFFFFFFFFFFFFFFF00000000030000000CB2BFC3
C5CDB3BCC6B2E9D1AF270000000000000000000000FFFFFFFFFFFFFFFF000000
00030000000EB2BFC3C5CDB3BCC6B2E9D1AFD2BB230000000000000000000000
FFFFFFFFFFFFFFFF00000000000000000AB2BFC3C5B8DFBCB6D2BB2300000000
00000000000000FFFFFFFFFFFFFFFF00000000000000000AB2BFC3C5B8DFBCB6
B6FE230000000000000000000000FFFFFFFFFFFFFFFF00000000000000000AB2
BFC3C5B8DFBCB6C8FD270000000000000000000000FFFFFFFFFFFFFFFF000000
00000000000EB2BFC3C5CDB3BCC6B2E9D1AFB6FE270000000000000000000000
FFFFFFFFFFFFFFFF00000000020000000EB2BFC3C5CDB3BCC6B2E9D1AFC8FD23
0000000000000000000000FFFFFFFFFFFFFFFF00000000000000000AB2BFC3C5
B8DFBCB6CBC4230000000000000000000000FFFFFFFFFFFFFFFF000000000200
00000AB2BFC3C5B8DFBCB6CEE5230000000000000000000000FFFFFFFFFFFFFF
FF00000000000000000AB2BFC3C5B3ACBCB6D2BB230000000000000000000000
FFFFFFFFFFFFFFFF00000000000000000AB2BFC3C5B3ACBCB6B6FE2500000000
00000000000000FFFFFFFFFFFFFFFF00000000000000000CC4EABCB6CDB3BCC6
B2E9D1AF290000000000000000000000FFFFFFFFFFFFFFFF0000000000000000
10B2BFC3C5C4EABCB6CDB3BCC6B2E9D1AF210000000000000000000000FFFFFF
FFFFFFFFFF000000000300000008D3A6CAD5B4A6C0ED21000000000000000000
0000FFFFFFFFFFFFFFFF000000000300000008D3A6CAD5B3F5CABC2100000000
00000000000000FFFFFFFFFFFFFFFF000000000000000008CAD6B6AFB3F5CABC
210000000000000000000000FFFFFFFFFFFFFFFF000000000300000008C5FAC1
BFC9FAB3C9270000000000000000000000FFFFFFFFFFFFFFFF00000000000000
000EB0B4B0E0BCB6C5FAC1BFC9FAB3C9270000000000000000000000FFFFFFFF
FFFFFFFF00000000000000000EB0B4CBDEC9E1C5FAC1BFC9FAB3C92700000000
00000000000000FFFFFFFFFFFFFFFF00000000000000000EB0B4CCD8D5F7C5FA
C1BFC9FAB3C9210000000000000000000000FFFFFFFFFFFFFFFF000000000000
000008D7D4B6AFB3F5CABC210000000000000000000000FFFFFFFFFFFFFFFF00
0000000000000008D3A6CAD5B5F7D5FB210000000000000000000000FFFFFFFF
FFFFFFFF000000000000000008D3A6CAD5BCC7D5CB}
end
object ListBox1: TListBox
Left = 276
Top = 0
Width = 318
Height = 446
Align = alClient
DragMode = dmAutomatic
ItemHeight = 13
TabOrder = 1
OnDragDrop = ListBox1DragDrop
OnDragOver = ListBox1DragOver
end
end