有一个TreeView,下面有10个节点,这10个节点是在最顶层的,它们又都有几层子节点,任意点中一个节点,有没有办法知道当前的节点是处于10个节点中的那一个?
要求简单,易行的好方法,能解决也可

解决方案 »

  1.   

    必需要在treeview.node.data或数据库里做好标记
      

  2.   

    treeview.node.data怎么设置?有没有类似SetItemData的函数?
      

  3.   

    procedure TRptForm.Button1Click(Sender: TObject);
    var s:ttreenode;
        d:^string;
    begin
        new(d);
        d^:='唯一id';
        //你原来增加树几点的代码;
        s.data:=d;
        dispose(d);
    end;
    取的时候可以:
    var s:^string;
        s:=treenode.data;
        showmessage(s^);
      

  4.   

    可以遍历整个treeview然后每个top level都记录下来var
    NowNode:Ttreenode;
    result:integer;
    begin
       result:=0;
       NowNode:=TV.Items.GetFirstNode;
       while not NowNode=(你想要的条件) do
          begin
            If NowNode.Level=0 then
               Result:=NowNode.Index;//取得所属最高节点的index属性,记得第一个是0
            NowNode:=NowNode.GetNext;//指向下一节点
          end;
    end;
      

  5.   

    楼上的是我临时写得,可以实现你的要求但是细节上可能有BUG,今天没有时间了希望楼主自己完善:)
      

  6.   

    可以用treeview1.selected.text来区分的
    不过不好,有重复就完蛋了;
    还是用node.data吧,每个节点是个treenode对象
    都有自己的data属性,一个指向字符串的指针;
    字符串中只要存上数据库中的唯一的那个字段的数据就可区分了
      

  7.   

    procedure TForm1.Button5Click(Sender: TObject);
    var
        TempNode:TTreeNode;
    begin
        TempNode := TreeView1.Selected;
        while Treeview1.Selected.Parent <> nil  do
            TempNode := TempNode.Parent;
        Showmessage(TempNode.Text);
    end;
      

  8.   

    谢谢大家,
    我不打算遍历,我是想在建树的时候设置node.data,
    不知可以设置成数字不?
      

  9.   

    treeview1.Selected.Level 可以得到你点击的结点属于第几层,
    首层为0,其次为1,类推。
    treeview1.Selected.index 可以得到点击的结点属于当前层的第几个,
    首个为0,其次为1,类推。但要得到非首层结点的index就要用到父index和当前index一起判断,如:
    i1:=treeview1.Selected.Parent.Index;
    i2:=treeview1.Selected.index;
    这里i1是父结点的index,i2是当前结点的index。请试试。
      

  10.   

    procedure TForm1.Button5Click(Sender: TObject);
    var
        TempNode:TTreeNode;
    begin
        TempNode := TreeView1.Selected.Parent;
        while TempNode<> nil  do
            TempNode := TempNode.Parent;
        Showmessage(TempNode.Text);
    end;
      

  11.   

    先得到当前结点的层,通过treeview1.Selected.Level得到。
    做一循环,依次得到父结点的index,直到level=0,即可,我的思路是这样。
      

  12.   

    上面这个应该是最简单的,没有遍历树,比用DATA好。DATA是指针类型的,设置成数字当然没问题的。
      

  13.   

    建树代码procedure tmain.RootTree(treeview1:ttreeview);
    var
      query:TADOQuery;
      nodetemp:TTreenode;
      pstr:^string;
      str:string;
    begin
      with data.DmQuery do
      begin
        close;
        sql.Clear;
        sql.Text:='select * from xzdm';
        open;
        sort:='xcode';
        close;
      end;
      treeview1.Items.BeginUpdate;
      query:=TADOquery.Create(self);
      query.Connection:=data.BgConnection;
      with query do
      begin
        sql.Text:=str;
        open;
        if eof then exit;
        nodetemp:=nil;
        while not eof do
        begin
          new(pstr);
          pstr^:=fieldbyname('key').AsString;
          nodetemp:=treeview1.Items.AddObject(nil,fieldbyname('xname').AsString,pstr);
          next;
        end;
      end;
      while nodetemp<>nil do
      begin
        CreateTree(query,nodetemp,treeview1);
        nodetemp:=nodetemp.getPrevSibling;
      end;
      treeview1.Items.EndUpdate;
    end;procedure tmain.CreateTree(QuerySource:TADOQuery;NodeParent:TTreeNode;treeview1:ttreeview);
    var
      pstr1, pstr2 : ^string;
      i : integer;
      NodeTemp : TTreeNode;
    begin
      QuerySource.close;
      pstr1 := NodeParent.Data;
      QuerySource.Sql.Text := 'SELECT key,xcode,xname FROM xzdm WHERE right(xcode,7)='+''''+'0000000'+''''+' and parent = ' + '''' + pstr1^ + '''';
      QuerySource.open;
      QuerySource.First;
      if QuerySource.RecordCount = 0 then exit;  NodeTemp := nil;
      for i := 0 to QuerySource.RecordCount - 1 do
      begin
        new(pstr2);
        pstr2^ := QuerySource.FieldByName('key').AsString;
        NodeTemp := TreeView1.Items.AddChildObject(NodeParent,
          QuerySource.FieldByName('xname').AsString, pstr2);
        QuerySource.Next;
      end;  while NodeTemp <> nil do
      begin
        CreateTree(QuerySource, NodeTemp,treeview1);
        NodeTemp := Nodetemp.getPrevSibling;
      end;
    end;