有关TTreeView的问题

bencsdn 2003-08-20 11:23:01
我想实现:在TTreeView中右键单击某一节点,弹出快捷菜单,对节点进行操作,可是这时节点并未被选中,因此不知道哪一个TTreeNode被单击。
如何实现?能否实现?
...全文
20 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
swayi21 2003-08-20
  • 打赏
  • 举报
回复
procedure TfrmMain.TreeView1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
CurrNode: TTreeNode;
begin
if Button = mbRight then
begin
CurrNode := TreeView1.GetNodeAt(X, Y);
if CurrNode <> nil then
TreeView1.Selected := CurrNode;
end;
end;

看來, fengjn(小枫) 兄的更簡單。
雨后阳光2000 2003-08-20
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, Menus;

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
file1: TMenuItem;
select1: TMenuItem;
showroot1: TMenuItem;
showbtn1: TMenuItem;
showline1: TMenuItem;
close1: TMenuItem;
TreeView1: TTreeView;
procedure showroot1Click(Sender: TObject);
procedure showbtn1Click(Sender: TObject);
procedure showline1Click(Sender: TObject);
procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure close1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.showroot1Click(Sender: TObject);
begin
TreeView1.ShowRoot:=not TreeView1.ShowRoot;
showRoot1.Checked:=TreeView1.ShowRoot;
end;

procedure TForm1.showbtn1Click(Sender: TObject);
begin
TreeView1.ShowButtons:=not TreeView1.ShowButtons;
ShowBtn1.Checked:=TreeView1.ShowButtons;
end;

procedure TForm1.showline1Click(Sender: TObject);
begin
TreeView1.ShowLines:=not TreeView1.ShowLines;
showline1.Checked:=TreeView1.ShowLines;
end;

procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
TreeView1.BeginDrag(False);
end;

procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
TargetNode,SourceNode:TTreeNode;
begin
TargetNode:=TreeView1.GetNodeAt(X,Y);
if (Source=Sender) and (TargetNode<>nil) then
begin
Accept:=true;
SourceNode:=TreeView1.Selected;
while (TargetNode.Parent<>nil) and (TargetNode<>SourceNode) do
TargetNode:=TargetNode.Parent;
if TargetNode=SourceNode then
Accept:=False;
end
else
Accept:=False;
end;

procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
TargetNode,SourceNode:TTreeNode;
begin
TargetNode:=TreeView1.GetNodeAt(X,Y);
if TargetNode<>nil then
begin
SourceNode:=TreeView1.Selected;
SourceNode.MoveTo(TargetNode,naAddChildFirst);
TargetNode.Expand(False);
TreeView1.Selected:=TargetNode;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
TreeView1.LoadFromFile(ExtractFilePath(Application.ExeName)+'TreeText1.txt');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TreeView1.SaveToFile(ExtractFilePath(Application.ExeName)+'TreeText1.txt');
end;

procedure TForm1.close1Click(Sender: TObject);
begin
close;
end;

end.
waysoft 2003-08-20
  • 打赏
  • 举报
回复
通过鼠标位置,应该可以确定节点,没试过,但查查帮助应该可以解决。
flyhot 2003-08-20
  • 打赏
  • 举报
回复
up
swayi21 2003-08-20
  • 打赏
  • 举报
回复
我這樣想(沒測試啊):
  在鼠標按下事件里,選擇當前光標位置的節點 ...
fengjn 2003-08-20
  • 打赏
  • 举报
回复
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var node: TTreeNode;
begin
if Button = mbRight then
begin
sendMessage(TreeView1.Handle,WM_LBUTTONDOWN,0,MakeLong(x,y));
end;
end;
IORILI 2003-08-20
  • 打赏
  • 举报
回复
好像不行,我以前也是过,须先点左键

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧