TreeView控件在右键尚未松开时,焦点是在被单击的节点上的;但只要一松开,在我的菜单弹出之前,焦点就回到原先的选中节点上去了。对比一下Windows的资源管理器中的TreeView,是在菜单功能执行之后才回到原选中节点上的。我需要类似资源管理中的表现。
    一定给分。

解决方案 »

  1.   

    响应RButtonDown,得到当前鼠标位置上的Item,再Select.
      

  2.   

    是完成拖动操作吗?
    用Node := self.TreeView.GetNodeAt(X, Y);测试鼠标松开时所处的结点,
      

  3.   

    procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button=mbRight then
       Treeview1.Selected :=Treeview1.GetNodeAt(X,Y);
    end;
    当右键点击时,使被点击节点成为被选中节点;如果想执行完操作后,回到之前的被选中节点;定义一个节点变量,var myNode:TTreeNode;
    在if Button=mbRight then之前写
    myNode:=Treeview1.selected;  //保存之前的被选中节点
    ... //执行操作
    Treeview1.selected:=myNode;  //返回之前被选中节点
      

  4.   

    TreeView的OnContextPopup事件!
    procedure TMainForm.TreeView1ContextPopup(Sender: TObject;
      MousePos: TPoint; var Handled: Boolean);
    begin
      if TreeView1.GetNodeAt(MousePos.X, MousePos.Y)<>nil then
         begin
           TreeView1.ClearSelection;
           TreeView1.GetNodeAt(MousePos.X, MousePos.Y).Selected:=true;
         end;
    end;
    这80分是我的了
      

  5.   

    首先感谢大家热情解答!
    我的问题还要稍微复杂一点:
        对比一下Windows的资源管理器,当我们用右键点击某节点时,被击的节点以蓝背景显示,但右侧的文件夹内容并不会跟着变化;而在菜单消失后,选中的节点仍是右击前的节点。也就是说,TreeView.Selected属性在此过程中并未发生变化,只是在右击事件进行中,被右击的节点暂时以蓝背景显示而已。
        大家提供的解法中都有对Selected属性的修改,而我不希望激发OnChange事件。也就是说,我希望弹出时,被右击的节点以蓝背景显示,但不想将此节点设为选中节点。请大家再想想别的办法!以上各位都会有分,能解决问题的,独得80分!
      

  6.   

    哈哈,就这么简单:将Treeview1的PopupMenu属性设为你想弹出的菜单,不用写任何代码,效果和你要的一样。补充:
    要在程序中手动设置selected,Treeview的HideSelection属性要设为false
    要鼠标移到某个节点时,出现下划线,将HotTrack属性设为true怕你觉得80分不值,多说了两句 *^_^*
      

  7.   

    treeview的rightclickselect属性改为true.
    这样treeview1.selected就是右键点击的结点了。简单的。
      

  8.   

    procedure TFrmFh.TvwFhMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
       TpNode : TTreeNode;
    begin
        if Button = mbRight then
        begin
          try
            TpNode := TvwFh.GetNodeAt(X,Y);
          except
             exit;
          end;
            if TpNode <> nil then
            begin
              PopupMenu.Popup(x + Left + 20, y + Top + 20);
            end;
        end;
    end;
      

  9.   

    这是弹出菜单。可以把
            if TpNode <> nil then
            begin
              PopupMenu.Popup(x + Left + 20, y + Top + 20);
            end;
    换成
            if TpNode <> nil then
            begin
              trrview.select := Tpnode;
            end;
    就可以了。
      

  10.   

    再次感谢大家热情帮助!再次说明我的目的:
        我希望在右击及菜单保持在弹出状态时,TreeView中被右击的节点能以蓝背景显示,在我选择一某一项菜单后,蓝背景才回到先前的焦点上。目前Delphi的动作是:在右击时,节点以蓝背景显示,但只要鼠标一松开,蓝背景就回到右击前的Selected节点上去了。
        回答的都将给分。能解决问题的得100分。
      

  11.   

    再次说明,就这么简单:(效果绝对和你要的一样)将Treeview1的PopupMenu属性设为你想弹出的菜单,不用写任何代码,效果和你要的一样。
      

  12.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Menus, ComCtrls;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        PopupMenu1: TPopupMenu;
        N1: TMenuItem;
        N2: TMenuItem;
        procedure N1Click(Sender: TObject);
        procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure N2Click(Sender: TObject);
      private
        NowNode:TTreeNode;
        OldNode:TTreeNode;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.N1Click(Sender: TObject);
    begin
      OldNode:=NowNode;
    end;procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      OldNode:=TreeView1.Selected;
      NowNode:=TreeView1.GetNodeAt(X,Y);
      TreeView1.Selected:=NowNode;
    end;procedure TForm1.N2Click(Sender: TObject);
    begin
      TreeView1.Selected:=OldNode;
      NowNode:=OldNode;
    end;end.