递归法选取树子节点 + 控件拖放

递归法选取树子节点 + 控件拖放

适合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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值