treeview 中有类似 tdbgrid 的 oncellclick的东东吗?

lavendun 2003-03-31 04:54:35
我想在选中tree的叶子的时候 ,提取她的叶子内容,但是,当打开子树时不做响应。 呵呵,很弱的问题。
...全文
20 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lavendun 2003-04-01
  • 打赏
  • 举报
回复
恩,没错,是能解决95%的问题,暂时算是够用了。 你直接从node判断更好些。
当然,我这里用的没有重名出现,就没考虑。 为了安全还是觉得你的更好一点。
那就先这样了。
heixiu1980 2003-04-01
  • 打赏
  • 举报
回复
hehe,我这边断网了,刚才刚想推荐给你类似的算法
TempNode:=TreeView1.GetNodeAt(X,Y);
if (TempNode=nil) or (TempNode<>TreeView1.Selected) then
ShowMessage('NO')
else
ShowMessage('Yes');
但是这只能95%的解决问题,
你点击TreeView1.Selected所在行的任意一点就穿帮了:)
你的算法还有个漏洞,用text的话万一重名怎么办?
lavendun 2003-04-01
  • 打赏
  • 举报
回复
哈哈哈哈,问题基本解决:(看看有漏洞吗?)
node:=treeview1.GetNodeAt(X,Y);
If Node=nil Then Exit;
if treeview1.Selected.Text=node.text then
showmessage(node.text);

这样点打开子树的+就不会随便响应了。
lavendun 2003-04-01
  • 打赏
  • 举报
回复
明白了, 测试结果和用 If Not Assigned(Node) Then Exit;一样。没有反应。

然而,如果用 node:=treeview1.GetNodeAt(X,Y); 则是只要你点中哪个叶子所在的行

的任何一点都会认为你点中了哪个node .还是不能解决根本问题。

heixiu1980 2003-04-01
  • 打赏
  • 举报
回复
If Node=nil then exit;改成这样试试
lavendun 2003-04-01
  • 打赏
  • 举报
回复
黑修,我就是在那里测的啊,没用。 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;
这样是可以的,但是当打开子树前的+时,也同样秀一个消息。
如果用 杀手的代码就是一个也秀不出来。
ezlz 2003-04-01
  • 打赏
  • 举报
回复
OnClick也可以用的嘛,在单击时取选定结点的唯一索引值,如:

i:=treeview1.Selected.AbsoluteIndex;

然后以当前选定结点为参数,放进你的其它过程中即可。

请试试。
heixiu1980 2003-04-01
  • 打赏
  • 举报
回复
上面的东东直接放在MouseDown中就可以了,MouseDown自带的参数包括X,Y。可以直接调用。
lavendun 2003-03-31
  • 打赏
  • 举报
回复
杀手 的代码 我测试了。

简单的showmessage就 秀不出来。(放在mouse down 事件中)不应该啊。

前提是哪个TREE 不是设计时做的,是form2产生时 addchild 加的。

tony 和黑修 思路一致,还没具体测试呢?
Eastunfail 2003-03-31
  • 打赏
  • 举报
回复
var ms:TPOINT;
Node:TTreeNode;
begin
GetCursorPos(ms);
Node:=TTreeView(Sender).GetNodeAt(ms.x,ms.y);
If Not Assigned(Node) Then Exit;
{下面添加你的代码}

end;
tonylk 2003-03-31
  • 打赏
  • 举报
回复
我一般的做法是在MouseDown中用GetNodeAt(X,Y)取得鼠标所在位置的Item,记录在变量中,如果没有,变量就为nil,然后在click或dblclick中判断只有临时变量记录的item为当前选中的item时才作操作。
lavendun 2003-03-31
  • 打赏
  • 举报
回复
哦,是吗?就是因为用X,Y坐标比较麻烦,所以一直不想用,也不是很清楚怎么用。
这样说来,我要测试一下了。那么上面的东东直接放在mousedown事件中就可以吗?
同样没有说明x,y啊。
heixiu1980 2003-03-31
  • 打赏
  • 举报
回复
var
TempNode:TTreeNode;
begin
TempNode:=TreeView1.GetNodeAt(X,Y);
end;

GetNodeAt是判断X,Y这个点是否有节点,如果有,返回一个TTreeNode型的值,
如果没有,返回nil,
由于OnClick没有提供直接的X,Y坐标,比较麻烦,
所以推荐你在MouseDown事件里用。
lavendun 2003-03-31
  • 打赏
  • 举报
回复
那和在onclick中有什么区别。(我在onclick中测试过,当点击打开一个子接点,就会响应
上次选择的叶子) 有具体点的着吗?
heixiu1980 2003-03-31
  • 打赏
  • 举报
回复
错了,是MouseDown
heixiu1980 2003-03-31
  • 打赏
  • 举报
回复
没有,但是有GetNodeAt这个函数,你在KeyDown中试试。

5,386

社区成员

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

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