我的树结构如下:
…总公司
  |
  …行政部
  …财务部
…分公司
  |
  …行政部
  …财务部
 …更多
表结构如下:
AutoId CName FatherId
13 总公司 0
14 行政部 13
16 财务部 13
18 供应部 13
20 分公司 0
21 行政部 20
22 财务部 20
创建树代码如下:
procedure TForm1.AddClass(AId: integer;FatherNode:TTreeNode);
var
    QryTmp:TADOQuery;
    myNode:TTreeNode;
    myLabel:TLabel;
begin
    QryTmp:=TADOQuery.Create(self);
    QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'NetTv.mdb;Persist Security Info=False';
    QryTmp.SQL.Add('select * from act');
    QryTmp.SQL.Add('where FatherId='+inttostr(AId));
    QryTmp.Open;
    while not QryTmp.Eof do
    begin
        myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('CName').AsString);        //创建标签,caption存放各分支的AutoId表识
        myLabel:=TLabel.Create(self);
        myLabel.Visible:=false;
        myLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
        myNode.Data:=myLabel;        AddClass(QryTmp.fieldbyname('AutoId').AsInteger,myNode); //递归调用过程
        QryTmp.Next;
    end;
    QryTmp.Free;
end;
问题:
    怎么取“选中的子结点”所对应的编号?
  例如:如果点击“分公司->行政部”,怎么知道它对应的'AutoId'?
注意:
  若点击“总公司”或“分公司”则不取值

解决方案 »

  1.   

    在你加入一个节点的时候就,
    Node.AddObject(TObject(AutoId));
      

  2.   

    1:
    var s: string;
        ParNode: TTreeNode;
    begin
      if TreeView1.Selected = Nil then Exit;
      ParNode := TreeView1.Selected;
      s := ParNode.Text;
      while  ParNode.Parent <> Nil do
      begin
        ParNode := ParNode.Parent;
        s := ParNode.Text + ' --> ' + s;
      end;
      ShowMessage(s);
    end;  根据以上过程,如果你知道了s值(路径),然后再就是一个展开s的过程了
      

  3.   

    你这样取不出来的。先定义一个自己的类
    type
      TObjectData = class
        nItemData:integer;
       public
        constructor Create();
      end;
    声明此类的一个对象
    tmpObjectData: TObjectData;
    tmpObjectData := TObjectData.Create;tmpObjectData.nItemData = AId;
    myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('CName').AsString);
    改为:myNode:=Treeview1.Items.AddObject(FatherNode,QryTmp.fieldbyname('CName').AsString, tmpObjectData1);
    取AID时用
    tmpObjectData1 :=  TObjectData(myNode.Selected.Data)tmpObjectData1.nItemData 即是AID 别忘了在删除结点时释放内存
      

  4.   

    JavaD(一竿残照) 的方法也是可以的,定义一个类可以在结点中增加该类的所有成员
      

  5.   

    晕,树自己有data,你定义一个结构体,然后定义一个指向它的指针,每加一个新接点,就加一个这个结构体指针,设计你的结构体就行了能存放很多数据。
      

  6.   

    谢谢各位……只是我看不太明白:(
    正在学习delphi能否把完整的代码帖出来,谢谢……