对于TreeView,可以在MouseDown事件里,判断
   If TreeView1.Selected<>nil Then
      

解决方案 »

  1.   

    我自己都是用MouseDown及MouseUp来实现的,但效果总是比不上Window的资源管理器。
    各位可否有比较好的方法呢?
      

  2.   

    调用GetNodeAt(X,Y)来判断当前是否点中Item,若点中了Item
    调用Menu.PopUp;
      

  3.   

    主要问题不在于判断是否点中Item,而在于如果我先在TreeView的空白地方产生Click事件,即先MouseDown再MouseUp,再在TreeView的Item上按下鼠标右键不动,它竟然不能激活MouseDown事件,而按着右键时要走动鼠标才能激活MouseDown事件,故本人觉得很奇怪。
      

  4.   

    有注释,自己看吧。pas文件:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Menus, ComCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Splitter1: TSplitter;
        ListView1: TListView;
        PopupMenu1: TPopupMenu;
        ThisisaTreeNode1: TMenuItem;
        PopupMenu2: TPopupMenu;
        Thisisalistitem1: TMenuItem;
        procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure ListView1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if (ssRight in Shift)  // 是右击
          and Assigned(TreeView1.GetNodeAt(X,Y)) then // 是一个节点
      begin
        with TreeView1.ClientToScreen( Point(X,Y) ) do  // 转换坐标
          PopupMenu1.Popup( x, y ); // 弹出
      end;
    end;procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if (ssRight in Shift) // 是右击
          and Assigned(ListView1.GetItemAt(X,Y)) then // 是一个项目
      begin
        with TreeView1.ClientToScreen( Point(X,Y) ) do // 转换坐标到屏幕
          PopupMenu2.Popup( x, y ); // 弹出
      end;
    end;end.dfm文件:object Form1: TForm1
      Left = 2
      Top = 107
      Width = 696
      Height = 480
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object Splitter1: TSplitter
        Left = 121
        Top = 0
        Width = 3
        Height = 453
        Cursor = crHSplit
      end
      object TreeView1: TTreeView
        Left = 0
        Top = 0
        Width = 121
        Height = 453
        Align = alLeft
        Indent = 19
        TabOrder = 0
        OnMouseDown = TreeView1MouseDown
        Items.Data = {
          010000001A0000000000000000000000FFFFFFFFFFFFFFFF0000000002000000
          01611A0000000000000000000000FFFFFFFFFFFFFFFF00000000000000000162
          1A0000000000000000000000FFFFFFFFFFFFFFFF000000000100000001631A00
          00000000000000000000FFFFFFFFFFFFFFFF00000000000000000164}
      end
      object ListView1: TListView
        Left = 124
        Top = 0
        Width = 564
        Height = 453
        Align = alClient
        Columns = <>
        Items.Data = {
          500000000300000000000000FFFFFFFFFFFFFFFF000000000000000003616161
          00000000FFFFFFFFFFFFFFFF00000000000000000362626200000000FFFFFFFF
          FFFFFFFF000000000000000003636363}
        TabOrder = 1
        OnMouseDown = ListView1MouseDown
      end
      object PopupMenu1: TPopupMenu
        Left = 55
        Top = 104
        object ThisisaTreeNode1: TMenuItem
          Caption = 'This is a Tree Node'
        end
      end
      object PopupMenu2: TPopupMenu
        Left = 259
        Top = 90
        object Thisisalistitem1: TMenuItem
          Caption = 'This is a list item'
        end
      end
    end小说明,右边一个TreeView,中间一个TSplitter,右边是一个ListView
      

  5.   

    标准答案:
    procedure TForm1.lvwMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    Begin
       if (htOnItem in lvw.GetHitTestInfoAt(X,Y)) and ((Button=mbRight)then
         DiSomething...
    End;
      

  6.   

    调用GetNodeAt(X,Y)来判断当前是否点中tree,返回为NIL就不做操作
    若点中了就使用POPmenu菜单,至于参数吗,就是你getnodeat的返回值
    绝对正确!