我想在选中tree的叶子的时候 ,提取她的叶子内容,但是,当打开子树时不做响应。 呵呵,很弱的问题。

解决方案 »

  1.   

    没有,但是有GetNodeAt这个函数,你在KeyDown中试试。
      

  2.   

    那和在onclick中有什么区别。(我在onclick中测试过,当点击打开一个子接点,就会响应
    上次选择的叶子) 有具体点的着吗?
      

  3.   

    var
      TempNode:TTreeNode;
    begin
      TempNode:=TreeView1.GetNodeAt(X,Y);
    end;GetNodeAt是判断X,Y这个点是否有节点,如果有,返回一个TTreeNode型的值,
    如果没有,返回nil,
    由于OnClick没有提供直接的X,Y坐标,比较麻烦,
    所以推荐你在MouseDown事件里用。
      

  4.   

    哦,是吗?就是因为用X,Y坐标比较麻烦,所以一直不想用,也不是很清楚怎么用。
    这样说来,我要测试一下了。那么上面的东东直接放在mousedown事件中就可以吗?
     同样没有说明x,y啊。
      

  5.   

    我一般的做法是在MouseDown中用GetNodeAt(X,Y)取得鼠标所在位置的Item,记录在变量中,如果没有,变量就为nil,然后在click或dblclick中判断只有临时变量记录的item为当前选中的item时才作操作。
      

  6.   

    var ms:TPOINT;
       Node:TTreeNode;
    begin
       GetCursorPos(ms);
       Node:=TTreeView(Sender).GetNodeAt(ms.x,ms.y);
       If Not Assigned(Node) Then Exit;
       {下面添加你的代码}end;
      

  7.   

    杀手 的代码 我测试了。 简单的showmessage就 秀不出来。(放在mouse down 事件中)不应该啊。前提是哪个TREE 不是设计时做的,是form2产生时 addchild 加的。tony 和黑修 思路一致,还没具体测试呢?
      

  8.   

    上面的东东直接放在MouseDown中就可以了,MouseDown自带的参数包括X,Y。可以直接调用。
      

  9.   

    OnClick也可以用的嘛,在单击时取选定结点的唯一索引值,如:i:=treeview1.Selected.AbsoluteIndex;然后以当前选定结点为参数,放进你的其它过程中即可。请试试。
      

  10.   

    黑修,我就是在那里测的啊,没用。 If Not Assigned(Node) Then Exit;到这里就跳出了。
    下面的当然没有用了。为什么? 难道我的node 都是不合法的吗?
     procedure TForm2.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
         var ms:TPOINT;
       Node:TTreeNode;
    begin
         node:=treeview1.GetNodeAt(X,Y); 
         //GetCursorPos(ms);
     // Node:=TTreeView(Sender).GetNodeAt(ms.x,ms.y);
       If Not Assigned(Node) Then Exit;
       {下面添加你的代码}
         showmessage(node.text);
    end;
    这样是可以的,但是当打开子树前的+时,也同样秀一个消息。
    如果用 杀手的代码就是一个也秀不出来。
      

  11.   

    If Node=nil then exit;改成这样试试
      

  12.   

    明白了, 测试结果和用 If Not Assigned(Node) Then Exit;一样。没有反应。然而,如果用 node:=treeview1.GetNodeAt(X,Y); 则是只要你点中哪个叶子所在的行的任何一点都会认为你点中了哪个node .还是不能解决根本问题。
      

  13.   

    哈哈哈哈,问题基本解决:(看看有漏洞吗?)
         node:=treeview1.GetNodeAt(X,Y);
         If Node=nil Then Exit;
        if treeview1.Selected.Text=node.text then
         showmessage(node.text);这样点打开子树的+就不会随便响应了。
      

  14.   

    hehe,我这边断网了,刚才刚想推荐给你类似的算法
      TempNode:=TreeView1.GetNodeAt(X,Y);
      if (TempNode=nil) or (TempNode<>TreeView1.Selected) then
        ShowMessage('NO')
      else
        ShowMessage('Yes');
    但是这只能95%的解决问题,
    你点击TreeView1.Selected所在行的任意一点就穿帮了:)
    你的算法还有个漏洞,用text的话万一重名怎么办?
      

  15.   

    恩,没错,是能解决95%的问题,暂时算是够用了。 你直接从node判断更好些。
     当然,我这里用的没有重名出现,就没考虑。 为了安全还是觉得你的更好一点。
    那就先这样了。