不是你双击调用 treeview1.selected.edittext 造成的修改状态,而是当‘超级用户’和‘普通用户’是选中状态时,此时你乱点击,点中了 该节点,系统自动将该节点设置为编辑状态。 你可以将TreeView设置为ReadOnly,在MouseDown事件中通过GetNodeAt(X,Y)来判断当前节点, 如果不是‘超级用户’和‘普通用户’,则将TreeView的ReadOnly设为false,否则设置为True。 if TreeView1.GetNodeAt(X,Y)<>nil then if (TreeView1.GetNodeAt(X,y).Text='超级用户') or (TreeView1.GetNodeAt(X,y).Text='普通') then TreeView1.ReadOnly:=true else TreeView1.ReadOnly:=false;
就是楼上说的那样 else begin treeview1.readonly:=false; exit; end;
偶可能有些钻了 不过有一个更奇特的现象:经过偶试验,偶上述的说法也不对,实际是: 第一次点击后,第二次稍重点击,然后摁住不松手,这是被选中的节点就已经处于 编辑状态了, 而且,多做几次,所有节点全部失去编辑响应,即都不可编辑了 代码: if (Treeview1.selected.text='超级用户') or (Treeview1.selected.text='普通用户') then treeview1.readonly:=true else Treeview1.selected.Edittext; 你可试验一下
//建立新工程节点 procedure TForm1.NewProject1Click(Sender: TObject);//菜单事件 var Node:TTreeNode; begin if Treeview1.Items.Count =0 then begin Node:=Treeview1.Items.Add(nil,'新工程'); TreeView1.Selected :=Node; Node.EditText ; end else begin Node:=Treeview1.Selected ; Node:=Treeview1.Items.Add(Node,'新工程'); TreeView1.Selected :=Node; Node.EditText ; end end;//建立新井节点 procedure TForm1.NewLog1Click(Sender: TObject);//菜单事件 var Node:TTreeNode; begin Node:=Treeview1.Selected ; if Node.parent =nil then begin Node:=Treeview1.Items.AddChild(Node,'新井'); TreeView1.Selected :=Node; Node.EditText ; end;end;//如果工程和井尚未建立子节点,允许修改其名称 procedure TForm1.TreeView1Editing(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean); begin if (Node.Parent <>nil)and (Node.Parent.Parent <>nil) then AllowEdit:=False else if (Node.Parent <>nil)and (Node.Parent.Parent =nil) then begin if (Node.getFirstChild =nil) then AllowEdit:=True else AllowEdit:=False; end else if (Node.Parent =nil) then begin if (Node.getFirstChild =nil) then AllowEdit:=True else AllowEdit:=False; end;end;我的一端代码。
treeview1.selected.edittext
造成的修改状态,而是当‘超级用户’和‘普通用户’是选中状态时,此时你乱点击,点中了
该节点,系统自动将该节点设置为编辑状态。
你可以将TreeView设置为ReadOnly,在MouseDown事件中通过GetNodeAt(X,Y)来判断当前节点,
如果不是‘超级用户’和‘普通用户’,则将TreeView的ReadOnly设为false,否则设置为True。
if TreeView1.GetNodeAt(X,Y)<>nil then
if (TreeView1.GetNodeAt(X,y).Text='超级用户') or (TreeView1.GetNodeAt(X,y).Text='普通') then
TreeView1.ReadOnly:=true
else
TreeView1.ReadOnly:=false;
else
begin
treeview1.readonly:=false;
exit;
end;
先选中 “超级、普通” ,然后在其上点击一下(较重),然后较慢松开,“超级、普通” 即被置于,可编辑状态,偶想进一步了解
你提供的mousedown则完全可行
不过有一个更奇特的现象:经过偶试验,偶上述的说法也不对,实际是:
第一次点击后,第二次稍重点击,然后摁住不松手,这是被选中的节点就已经处于
编辑状态了, 而且,多做几次,所有节点全部失去编辑响应,即都不可编辑了
代码:
if (Treeview1.selected.text='超级用户') or (Treeview1.selected.text='普通用户') then
treeview1.readonly:=true
else
Treeview1.selected.Edittext;
你可试验一下
问题已经结束楼上的 lyre说得没错, 要在 OnEditing 设置CanEdit参数比较可靠
procedure TForm1.NewProject1Click(Sender: TObject);//菜单事件
var
Node:TTreeNode;
begin
if Treeview1.Items.Count =0 then
begin
Node:=Treeview1.Items.Add(nil,'新工程');
TreeView1.Selected :=Node;
Node.EditText ;
end
else
begin
Node:=Treeview1.Selected ;
Node:=Treeview1.Items.Add(Node,'新工程');
TreeView1.Selected :=Node;
Node.EditText ;
end
end;//建立新井节点
procedure TForm1.NewLog1Click(Sender: TObject);//菜单事件
var
Node:TTreeNode;
begin
Node:=Treeview1.Selected ;
if Node.parent =nil then
begin
Node:=Treeview1.Items.AddChild(Node,'新井');
TreeView1.Selected :=Node;
Node.EditText ;
end;end;//如果工程和井尚未建立子节点,允许修改其名称
procedure TForm1.TreeView1Editing(Sender: TObject; Node: TTreeNode;
var AllowEdit: Boolean);
begin
if (Node.Parent <>nil)and (Node.Parent.Parent <>nil) then
AllowEdit:=False
else if (Node.Parent <>nil)and (Node.Parent.Parent =nil) then
begin
if (Node.getFirstChild =nil) then AllowEdit:=True
else AllowEdit:=False;
end
else if (Node.Parent =nil) then
begin
if (Node.getFirstChild =nil) then AllowEdit:=True
else AllowEdit:=False;
end;end;我的一端代码。