如何右键单击实现结点选择?

解决方案 »

  1.   

    在TreeView1的OnMouseDown事件中:
    procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbRight then
        if TreeView1.GetNodeAt(X, Y) <> nil then
          TreeView1.GetNodeAt(X, Y).Selected := True;
    end;
      

  2.   

    点击了右键之后处理MouseDown事件,然后调用TTreeView的GetNodeAt(x,y)函数就可以了
    传递MouseDown事件中的值就可以得到按下点的node没有话话获得null,注意两个坐标的原点可能不一样哦。要修改一下值。
      

  3.   

    谢谢以上回答,也可以这样。不过MouseUp却不行,为什么?procedure TSetPrtFrm.TreeView1ContextPopup(Sender: TObject;
      MousePos: TPoint; var Handled: Boolean);
    var
      TVNode:TTreeNode;
    begin
      TVNode:=Nil;
      TVNode:=TreeView1.GetNodeAt(MousePos.x,MousePos.y); // 取鼠标点的地方的TTreeNode
      if TVNode=Nil then
        Handled:=true                            // 鼠标点的地方没有TTreeNode,菜单不显
      else begin
        TreeView1.Selected:=TVNode;                       // 右键选中TTreeNode
        TreeView1Click(Sender);
      end;
    end;
      

  4.   

    忘记说了,上面程序顺便实现右键菜单,当然MouseUp中写
    PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y)也行。
      

  5.   

    跟踪了一下,发现在MouseUP中不行是因为传进来的X,Y值是相对于屏幕的,而不是TreeView的,转换一下就可以了:
    procedure TForm1.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var pt: TPoint;
    begin
      pt := Point(X, Y);
      pt := TreeView1.ScreenToClient(pt);
      if Button = mbRight then
        if TreeView1.GetNodeAt(pt.X, pt.Y) <> nil then
          TreeView1.GetNodeAt(pt.X, pt.Y).Selected := True;
    end;