高手请进:TreeView在右键单击时的焦点转移问题
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




