17. 11.
在Delphi的treeview应用中出错,单击子节点打开另一个窗口
treeview中的父节点和子节点如下:
我的客户
客户1
客户2
我的任务
任务a
任务b
任务bb
任务bc
任务任务bb是任务b的子节点,任务b是我的任务的子节点
我在想在TMainForm.TreeView1DblClick事件中
实现双击我的任务->任务b下的任意任务时,根据不同的任务返回不通的窗口:我写的代码如下:
if (selectedNode <>nil) and (SelectedNode.Level <> 0)then //Level为节点的等级
if selectedNode.Parent.Text='计划任务' then
begin
Litem:=selectedNode.Text;
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select rwmc from hrp_xmjhb a,hrp_fpgzb b where b.cybs='''+MstaffID+''' and b.jhgzbs=a.jhgzbs and a.rwlxbs=2 and rwztbs=6 and rwmc='''+Litem+'''');
adoquery2.Open;
Mrwmc:=adoquery2.FieldByName('rwmc').AsString;
if adoquery2.RecordCount>0 then
begin
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select jhgzbs from hrp_xmjhb where rwmc='''+Mrwmc+'''');
adoquery2.Open;
MDutyID:=adoquery2.FieldByName('jhgzbs').AsString;
//用循环可以消除同一个任务名称对应多个计划工作标识的情况
if adoquery1.RecordCount>0 then
begin
while not adoquery2.Eof do
begin
ViewScheduledTaskForm.ShowModal;
adoquery2.Next;
end;
end;
end;
end;
出现错误如下:双击任务a出现所要的窗口,但是再单击其他的没有节点的空白处,也能打开此窗口,并且窗口上面有:Selected.level=0
请问这是怎么回事啊,帮帮我啊
我已经加上selectedNode <>nil 选择的节点不为空了,怎么点击空白处还会按最后一次点击的那个节点弹出窗口啊
代码中按如下格式写,只要单击了一个节点就表示选中了,无论鼠标移到哪里在改变节点之前都有节点选中,所以判断TreeView.selected是否为nil并不管用!不是焦点的问题!
var
pt :TPoint;
begin
pt := Mouse.CursorPos;
pt := TreeView1.ScreenToClient(Mouse.CursorPos);
if TreeView.GetNodeAt(pt.X,pt.Y) <>nil then //判断鼠标的位置是否有节点
begin
…你的代码
end;
end;
楼上的大哥,请教一下,到下面这一步怎么都执行不下去了,都获得不到节点
if TreeView.GetNodeAt(pt.X,pt.Y) <>nil then //判断鼠标的位置是否有节点
TreeView是你控件的名称
还是其它原因?
我双击节点的时候,到这个if TreeView.GetNodeAt(pt.X,pt.Y) <>nil then都跳过去了,下面都没有执行
var
selectedNode:TTreeNode;
Litem,Mrwmc:string; //Mrwmc是主窗口中定义的任务名称,Litem是双击选定的节点
pt :TPoint;
begin
//验证点击的是不是计划工作中的任务
//MstaffID:=Login.staffID;//获得成员ID
// pt := Mouse.CursorPos;
pt := TreeView1.ScreenToClient(Mouse.CursorPos);
if TreeView1.GetNodeAt(pt.X,pt.Y) <>nil then //判断鼠标的位置是否有节点
begin
Litem:=TreeView1.Selected.Text;
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select rwmc from hrp_xmjhb a,hrp_fpgzb b where b.cybs='''+staffID+''' and b.jhgzbs=a.jhgzbs and a.rwlxbs=2 and rwztbs=6 and rwmc='''+Litem+'''');
adoquery2.Open;
Mrwmc:=adoquery2.FieldByName('rwmc').AsString;
if adoquery2.RecordCount>0 then
begin
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select jhgzbs from hrp_xmjhb where rwmc='''+Mrwmc+'''');
adoquery2.Open;
MDutyID:=adoquery2.FieldByName('jhgzbs').AsString;
//用循环可以消除同一个任务名称对应多个计划工作标识的情况
if adoquery2.RecordCount>0 then
while not adoquery2.Eof do
begin
ViewScheduledTaskForm.ShowModal;
adoquery2.Next;
end;
end;
end;
end;
我双击节点的时候,就是双击有节点的地方那个,到这个if TreeView.GetNodeAt(pt.X,pt.Y) <>nil then也跳过去了,下面都没有执行
这是怎么回事啊,大哥,帮帮我
初步看是TreeView1.GetNodeAt(pt.X,pt.Y)没有节点!
我尝试的原因是:
你不能注释掉这行代码 pt := Mouse.CursorPos;
你试一下
可以了,谢谢,我的右键单击出现的弹出菜单也是出现类似问题,不知道能不能用此处理
应该也可以,你记住这点:
只要单击了一个节点就表示选中了,无论鼠标移到哪里在改变节点之前都有节点选中,所以判断TreeView.selected是否为nil并不管用!不是焦点的问题!
在空白处单击,不会改变TreeView.selected!
结帖吧!结帖率为0?
给你一个建议,我以前也做过这样的一个,比你这个还复杂,treeview上的每个节点都可以在前面加载一个图片,每个图片进来的时候都有一个index值,在click事件里面获取节点图片的index属性,根据index你显示不同的窗体,根据选择节点的名称你到数据库里面查询相应的表,另外在treeview的每个节点上还能绑定你需要的data指针,你可以给一个值,根据这个值判断你选择的节点是什么。这样做的化,应该简单多了吧。