var TempNode:TTreeNode; begin TempNode:=TreeView1.GetNodeAt(X,Y); end;GetNodeAt是判断X,Y这个点是否有节点,如果有,返回一个TTreeNode型的值, 如果没有,返回nil, 由于OnClick没有提供直接的X,Y坐标,比较麻烦, 所以推荐你在MouseDown事件里用。
黑修,我就是在那里测的啊,没用。 If Not Assigned(Node) Then Exit;到这里就跳出了。 下面的当然没有用了。为什么? 难道我的node 都是不合法的吗? procedure TForm2.TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var ms:TPOINT; Node:TTreeNode; begin node:=treeview1.GetNodeAt(X,Y); //GetCursorPos(ms); // Node:=TTreeView(Sender).GetNodeAt(ms.x,ms.y); If Not Assigned(Node) Then Exit; {下面添加你的代码} showmessage(node.text); end; 这样是可以的,但是当打开子树前的+时,也同样秀一个消息。 如果用 杀手的代码就是一个也秀不出来。
If Node=nil then exit;改成这样试试
明白了, 测试结果和用 If Not Assigned(Node) Then Exit;一样。没有反应。然而,如果用 node:=treeview1.GetNodeAt(X,Y); 则是只要你点中哪个叶子所在的行的任何一点都会认为你点中了哪个node .还是不能解决根本问题。
哈哈哈哈,问题基本解决:(看看有漏洞吗?) node:=treeview1.GetNodeAt(X,Y); If Node=nil Then Exit; if treeview1.Selected.Text=node.text then showmessage(node.text);这样点打开子树的+就不会随便响应了。
hehe,我这边断网了,刚才刚想推荐给你类似的算法 TempNode:=TreeView1.GetNodeAt(X,Y); if (TempNode=nil) or (TempNode<>TreeView1.Selected) then ShowMessage('NO') else ShowMessage('Yes'); 但是这只能95%的解决问题, 你点击TreeView1.Selected所在行的任意一点就穿帮了:) 你的算法还有个漏洞,用text的话万一重名怎么办?
上次选择的叶子) 有具体点的着吗?
TempNode:TTreeNode;
begin
TempNode:=TreeView1.GetNodeAt(X,Y);
end;GetNodeAt是判断X,Y这个点是否有节点,如果有,返回一个TTreeNode型的值,
如果没有,返回nil,
由于OnClick没有提供直接的X,Y坐标,比较麻烦,
所以推荐你在MouseDown事件里用。
这样说来,我要测试一下了。那么上面的东东直接放在mousedown事件中就可以吗?
同样没有说明x,y啊。
Node:TTreeNode;
begin
GetCursorPos(ms);
Node:=TTreeView(Sender).GetNodeAt(ms.x,ms.y);
If Not Assigned(Node) Then Exit;
{下面添加你的代码}end;
下面的当然没有用了。为什么? 难道我的node 都是不合法的吗?
procedure TForm2.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var ms:TPOINT;
Node:TTreeNode;
begin
node:=treeview1.GetNodeAt(X,Y);
//GetCursorPos(ms);
// Node:=TTreeView(Sender).GetNodeAt(ms.x,ms.y);
If Not Assigned(Node) Then Exit;
{下面添加你的代码}
showmessage(node.text);
end;
这样是可以的,但是当打开子树前的+时,也同样秀一个消息。
如果用 杀手的代码就是一个也秀不出来。
node:=treeview1.GetNodeAt(X,Y);
If Node=nil Then Exit;
if treeview1.Selected.Text=node.text then
showmessage(node.text);这样点打开子树的+就不会随便响应了。
TempNode:=TreeView1.GetNodeAt(X,Y);
if (TempNode=nil) or (TempNode<>TreeView1.Selected) then
ShowMessage('NO')
else
ShowMessage('Yes');
但是这只能95%的解决问题,
你点击TreeView1.Selected所在行的任意一点就穿帮了:)
你的算法还有个漏洞,用text的话万一重名怎么办?
当然,我这里用的没有重名出现,就没考虑。 为了安全还是觉得你的更好一点。
那就先这样了。