Delphi:在树状视图中取消选择已选项目

4

有一个树形视图,MultiSelect:=true

如果选择了所有项目,则无法取消选择或重新选择其他项目。我认为我需要在TForm1.TreeView1Click中执行TreeView1.Selected.Selected:=false;。但如何知道单击不是在控件上:项目、按钮等?

视频:http://liga-installer.realservers.info/select.mp4

下面的代码是否正常?

procedure TForm1.TreeView1Click(Sender: TObject);
var
Item: TTreeNode;
 begin

  Item :=TTreeView(Sender).GetNodeAt(TTreeView(Sender).ScreenToClient(Mouse.CursorPos).X,
  TTreeView(Sender).ScreenToClient(Mouse.CursorPos).y);

  if (not Assigned(Item)) and (TTreeView(Sender).SelectionCount>0) then TTreeView(Sender).Select(nil, []);
 end;

谢谢!


我可以展示一个视频。我创建了一个新项目,选择了所有项目,但是无法取消选择。 - maxfax
请查看:http://liga-installer.realservers.info/select.mp4 - maxfax
1个回答

3

当您选择第一个项目时,应按住Shift键。您也可以通过Ctrl + 单击来逐个取消选择。

但我同意这是不直观的。我会这样做:

procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
begin
  if not Assigned(TreeView1.GetNodeAt(X, Y)) then
    for i := 0 to TreeView1.Items.Count - 1 do
      TreeView1.Items[i].Selected := false;
end;

如何通过单击取消全部选择?再次按住键并单击不方便。 - maxfax
@maxfax:使用GetNodeAtGetHitTestInfoAt函数。 - Andreas Rejbrand
7
取消选择TreeView1中的所有项:TreeView1.Select(nil, []); - Sertac Akyuz
我看了视频并在XE中尝试了这个,结果得到了相同的行为。我认为这是一个错误,如果还没有报告的话,应该在QC中报告。 - Rudy Velthuis
1
这种行为似乎是有意设计的,自从我第一次使用Delphi树状视图以来就一直存在。这是一个非常不符合直觉的设计。在我的应用程序中,我会对VCL进行修改,使控件的行为更好。 - David Heffernan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接