请问TreeView中如何控制PopupMenu,使其只有在选择了树的结点后点右键才出现?
如果点在TreeView的空白区,PopupMenu要不显示出来。
有高手指点说写TreeView的OnContextPopup事件,如:procedure TForm1.TreeView1ContextPopup(Sender: TObject;
  MousePos: TPoint; var Handled: Boolean);
begin
  Handled:=(htNowhere in TreeView1.GetHitTestInfoAt(MousePos.X,MousePos.Y));
end;
但是试过了没有用,或者是写TreeView1MouseUp事件,
procedure TForm1.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
nodx:ttreenode;
begin
   nodx:=treeview1.GetNodeAt(x,y);
  if nodx <> nil then
    treeview1.PopupMenu := popupmenu1
  else
    treeview1.PopupMenu := nil;
end;
试过也没有用。
求教。

解决方案 »

  1.   

    procedure TMDIChild.RzTreeView1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
      AnItem: TTreeNode;
    begin
      if Button=mbRight then  //&Oacute;&Atilde;&raquo;§°&acute;&Iuml;&Acirc;&Oacute;&Ograve;&frac14;ü&micro;&Atilde;&micro;&frac12;&micro;±&Ccedil;°&frac12;á&micro;&atilde;&Ouml;&micro;&sup2;&cent;&AElig;&ocirc;&Oacute;&Atilde;&iquest;ì&frac12;&Yacute;&sup2;&Euml;&micro;&yen;
      begin
        AnItem:=RzTreeView1.GetNodeAt(X, Y);
        if AnItem<>nil then
        begin
          RzTreeView1.Selected:=AnItem;
      

  2.   

    to cg1120:
    用了你的方法,如果点在TreeView的空白区,由于事件中将和空白处同样高度的y的节点的坐标获得了,PopupMenu还是显示出来,
      

  3.   

    to cg1120:
    人来,人来。
      

  4.   

    为什么不用简单点的方法?
    procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if treeview1.Selected=nil then
        PopupMenu2.AutoPopup:=false
      else
        PopupMenu2.AutoPopup:=true;
    end;
      

  5.   

    procedure TForm_TitleGroup.ADT_rightsMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Var
      Node :TTreeNode;
    begin
      if (Button = mbright) then
      begin
        Node := ADT_rights.Selected
        if( Node <> NIL )
          AND (X >= Node.DisplayRect(True).Left - 16) AND (Y >= Node.DisplayRect(True).Top)
          AND (X <= Node.DisplayRect(True).Left) AND (Y <= Node.DisplayRect(True).Top + 16) then
        treeview1.PopupMenu := popupmenu1
      else
        treeview1.PopupMenu := nil;
      end; end;
      

  6.   

    esu(ESU) 的方法较好,我赞成!!!
      

  7.   

    ahuige(灰不遛秋) 的方法有点小问题,就是点在一个节点的空白区,仍会弹出菜单来。理解原因,一节迎刃而解。
      

  8.   

    to ahuige:
    问题是当treeview第一次setfocus时,跟节点就已经是selected,如果点在空白的地方,还是跟节点selected.
      

  9.   

    to esu:
    你是自定义一个事件马,ADT_rightsMouseDown是什么?
      

  10.   

    to esu:
    你的方法用了,连点在节点上也没有右健菜单了,不是很明白你的程序中Node := ADT_rights.Selected中的ADT_rights是什么?
      

  11.   

    楼主没看仔细呢,esu的ADT_rights是他自己定义的树的名字呢!呵呵!
      

  12.   

    ADT_rights就是他的TreeView的name呀。呵呵,ESU的代码是没有问题的, 我也试了。
      

  13.   

    不会把,它下面还有treeview1.PopupMenu ,为什么不写成ADT_rights
      

  14.   

    X >= Node.DisplayRect(True).Left - 16
    什么意思啊
    学习 
      

  15.   

    X >= Node.DisplayRect(True).Left - 16
    什么意思啊
    学习