我是一个刚学习Delphi的菜鸟,请问大家,我想用TreeView显示一个简单的部门和人员的关系,怎么通过双击部门节点的时候通过部门的编号(部门节点显示的是部门名称)过滤出人员信息,然后添加到TreeView上。是不是通过TreeNode的Data属性?怎么用?有例子请发到:[email protected]
  谢谢!一定给分。

解决方案 »

  1.   

    TreeNode属性可用来携带一些自定义信息。据两个例子:
    example 1:type
       TTestData = class(tpersistent)
       private
       public
       published
       end;procedure onclick(sender : tobject);
    var
      tmpobj:TTestData;
    begin
      try
        tmpobj := TTestData.create;
        ......
        treeview1.selected.data   := pointer(tmpobj);
      finally
        tmpobj := nil
      end;
    end;example 2:
    type
       pTestData = ^TTestData
       TTestData = record
           a,b:integer;
       end;
    procedure OnClick(sender : tobject);
    var 
       xxx:pTestData;
    begin
       try
         getmem(xxx,sizeof(TtestData));
         treeview1.selected.data := xxx;
       except
         raise;
       end;
    end;
      

  2.   

    见http://www.csdn.net/expert/topic/1064/1064201.xml?temp=.6948206
    ////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////
    //////////数据库结构:                            //////////
    //////////department: name:部门名称,char         //////////
    //////////            d_no:部门号,int            //////////
    //////////worker:     name:员工姓名,char         //////////
    //////////            w_no:员工号,int            //////////
    //////////            d_no:部门号,int            //////////
    ////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, Db, ADODB;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Button1: TButton;
        ADOQuery1: TADOQuery;    //连接department
        ADOQuery2: TADOQuery;    //连接worker
        Edit1: TEdit;            //结点信息
        procedure Button1Click(Sender: TObject);//生成树
        procedure TreeView1Click(Sender: TObject);//显示结点信息
        procedure FormClose(Sender: TObject; var Action: TCloseAction);//释放p_data
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      p_data:pstring;
    implementation{$R *.DFM}//生成树
    procedure TForm1.Button1Click(Sender: TObject);
    var
       fn,sn:ttreenode;    //fn:部门结点 sn:员工结点
    begin
      treeview1.Items.BeginUpdate;
      adoquery1.close;
      adoquery1.sql.clear;
      adoquery1.sql.add('select * from department');
      adoquery1.open;
      treeview1.Items.Clear;
      new(p_data);
      p_data^:='root';
      fn:=treeview1.Items.AddObject(nil,'root',p_data);
      while not adoquery1.Eof do
      begin
        with treeview1.Items do
        begin
          new(p_data);
          p_data^:=adoquery1.fieldbyname('d_no').asstring;
          sn:=treeview1.Items.AddChildobject(fn,adoquery1.fieldbyname('name').asstring,p_data);      adoquery2.close;
          adoquery2.sql.Clear;
          adoquery2.sql.add('select * from worker where d_no=:d_no');
          adoquery2.Parameters.ParamByName('d_no').value:=p_data^;
          adoquery2.open;
          while not adoquery2.Eof do
          begin
            new(p_data);
            p_data^:=adoquery2.fieldbyname('w_no').asstring;
            treeview1.Items.addchildobject(sn,adoquery2.fieldbyname('name').asstring,p_data);
            adoquery2.Next;
          end;
        end;
        adoquery1.Next;
      end;
      adoquery1.Close;
      adoquery2.close;
      treeview1.Items.EndUpdate;
    end;//显示结点信息
    procedure TForm1.TreeView1Click(Sender: TObject);
    begin
      if treeview1.Selected=nil then exit;  case treeview1.Selected.Level of
      1:begin
           edit1.text:='部门号:'+pstring(treeview1.selected.Data)^;
        end;
      2:begin
           edit1.text:='工号:'+pstring(treeview1.selected.Data)^;
        end;
      end;
    end;
    //释放p_data
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if p_data<> nil then Dispose(p_data);
    end;end.
      

  3.   

    Data属性的类型为TPoint,你可以先把数据放在内存中,然后把指针赋给Data,当你选取一个TTreeItem,可以取TTreeItem(Sender).Data中的值(类型转化),就是你要的数据
      

  4.   

    在TreeView.OnDblClick事件中
    var
      DMNode:TTreeNode;//部门节点
    begin
    if (TreeView.Items.Count > 0) and (TreeView.Selected <>nil) then begin
      DMNode:=TreeView.Selected;
      Query.Close; 
      Query.Sql.Clear;
      Query.Sql.Add('select 人员名称 from 部门表,人员表');
      Query.Sql.Add(' where 部门表.部门名称='''+DMNode.Text+'''');
      Query.sql.add(' and 部门表.部门编号=人员表.部门编号');
      query.open;
      if Query.recordcount > 0 then begin
        Query.Frist;
        while not query.eof do begin
          TreeView.items.AddChild(DMNode,query['人员名称']);
          Query.next;
        end;
      end;
    end;
    end;
    搞定
      

  5.   

    chutian:
    你给我的怎么用Delphi6大不开呀?
      

  6.   

    TreeView的Data属性是指针类型,也就是说,它挂的东西是一个指针。所以,在你建树前,你必须先把要在树上显示出来的记录用对象保存在内存,如TList或继承于它的其他类或自定义类的实例。在建树过程中,把每个节点的data属性对应一个对象列表的一个对象,这样,每个节点的data属性中,就挂了一个对象。
    如果你的部门类可以设计一个方法:FindEmployeeByDepartID(aDepartID:String)用来在已经保存在内存的部门对象列表中查找它的员工信息就更好。
    在你的例子中,在你部门树的Onchange事件里,
    TDepartment(TV.selected.data).FindEmployeeByDepartID;
    然后把查询出来的东西显示出来就可以了。