大家帮我看看这个treeview的奇怪问题(100分)

  • 主题发起人 主题发起人 balloy
  • 开始时间 开始时间
B

balloy

Unregistered / Unconfirmed
GUEST, unregistred user!
我的treeview是可以在运行期间修改的,我提供了删除结点的功能 -- 使用右键菜单实现,
为了方便用户使用,我添加了快捷键(Del),但有趣的事发生了,
当我修改结点标题时,选中一段文字,Del,居然调用了删除结点的函数,而不是删除文字!!
这个非常不方便。请问如何解决?
 
在Del的事件里加以判断,看看是否是处于修改结点标题状态

如果不是,才执行,如果是,则不执行
 
最好把源码拿来看看,让大家一起来分析:)
 
如何判断是否是处于修改结点标题状态?
 
另外,我的窗体上还放了一个Memo,结果在Memo内Del,也会删除结点
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
TreeView1: TTreeView;
procedure TreeView1Editing(Sender: TObject; Node: TTreeNode;
var AllowEdit: Boolean);
procedure TreeView1Edited(Sender: TObject; Node: TTreeNode;
var S: String);
procedure TreeView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
bEditing: Boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.TreeView1Editing(Sender: TObject; Node: TTreeNode;
var AllowEdit: Boolean);
begin
bEditing := True;
end;

procedure TForm1.TreeView1Edited(Sender: TObject; Node: TTreeNode;
var S: String);
begin
bEditing := False;
end;

procedure TForm1.TreeView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_DELETE) and not bEditing then
begin
删除节点
end;
end;

end.
 
把DEL的过程写在Treeview的ONKEYPress里,不要写在FORM的ONkeyPress里
 
动作/菜单热键是优先的,可以看看Delphi的源程序,建议你的热键定义不要和编辑键一样。
解决该问题应该先当前聚焦控件是不正是上TreeView,并且TreeView是否正在编辑节点,如:
在菜单事件中,即在删除节点前加上:
if Treeview.Focused and not TreeView.IsEditing then
...
 
if treeview1.IsEditing=false then
treeview1.Selected.Delete
这样在修改时不会删除节点了
 
非常感谢大家,del的问题解决了,在TreeView1KeyDown里加入判断
if Treeview.Focused and not TreeView.IsEditing then就可以了,

非常谢谢!

现在又有一个问题:我还添加了快捷键 Left / Right (我希望这个可以连续地遍历所有结点),
但如果在TreeView1KeyDown里写的话,会首先调用TreeView自己的Left / Right处理,可以去掉它吗?
 
你到底还有几个奇怪的问题啊!!!
每个人都这样,一个接一个,那搞个屁
 
to wwolf:
对不起,应该这是我同时遇到的两个问题,一时心急,就一起问了
 
多人接受答案了。
 
是我说话不好。抱歉。
 
后退
顶部