CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

高手请进:TreeView在右键单击时的焦点转移问题

楼主lyre(大头鬼)2002-09-10 21:33:56 在 Delphi / VCL组件开发及应用 提问

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

1 楼kimryo(God is on my side)回复于 2002-09-10 21:39:55 得分 5

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

2 楼Rich_Zhou(傻乎乎的同舟)回复于 2002-09-10 21:40:11 得分 5

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

3 楼oracle_lover(数据库情人)回复于 2002-09-10 21:44:57 得分 15

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;     //返回之前被选中节点  
  Top

4 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2002-09-10 21:46:07 得分 10

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分是我的了Top

5 楼lyre(大头鬼)回复于 2002-09-10 23:49:25 得分 0

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

6 楼ball_cao(Partten)回复于 2002-09-11 00:01:56 得分 5

为了你的问题,我在装Delphi5Top

7 楼oracle_lover(数据库情人)回复于 2002-09-11 08:58:55 得分 10

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

8 楼zyj320621(小朱)回复于 2002-09-11 09:11:54 得分 0

TreeView.LOckTop

9 楼stanely22(凤凰22)回复于 2002-09-11 09:19:39 得分 5

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

10 楼cooling(cooling)回复于 2002-09-11 09:37:16 得分 10

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;Top

11 楼cooling(cooling)回复于 2002-09-11 09:49:21 得分 10

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

12 楼lyre(大头鬼)回复于 2002-09-11 13:41:25 得分 0

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

13 楼lyre(大头鬼)回复于 2002-09-12 17:06:54 得分 0

看来没有回答了,散分,大家随喜吧。Top

14 楼oracle_lover(数据库情人)回复于 2002-09-12 23:44:41 得分 5

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

15 楼ball_cao(Partten)回复于 2002-09-16 23:22:04 得分 20

unit   Unit1;  
   
  interface  
   
  uses  
      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.Top

相关问题

  • VB中的控件 treeview 单击右键功能,怎么实现??
  • 怎样把onclick事件中转移成oncontextmenu事件?即单击出现右键菜单。
  • 请问,TreeView组件,如何能实现右键单击选定结点?
  • 请教一下,TreeView控件如何才能实现单击右键进行更新和删除操作呢???
  • 怎样实现单击右键事件?
  • 如何相应combobox的右键单击......
  • javascript的右键单击问题
  • 怎样判断单击的是右键?
  • 请教在TREEVIEW控件的NODECLICK事件中如何判断单击结点的是左键还是右键?如何判断双击?
  • TreeView鼠标右键问题?

关键词

  • 节点
  • 属性
  • 鼠标
  • treeview
  • tpnode
  • 右键
  • nownode
  • getnodeat
  • mousepos
  • 选中

得分解答快速导航

  • 帖主:lyre
  • kimryo
  • Rich_Zhou
  • oracle_lover
  • ly_liuyang
  • ball_cao
  • oracle_lover
  • stanely22
  • cooling
  • cooling
  • oracle_lover
  • ball_cao

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo