如何通过单击空白背景来选择任何内容?

问题描述 投票:3回答:2

我有一个虚拟树视图(例如TVirtualStringTree)。

  • 用户可以选择一行
  • 但如果他们也可以点击“无处”来选择没有行的直觉,那就太好了

enter image description here

注意:当然多选是关闭的;因为他们只能选择零个或一个项目

Makiri:

procedure TForm6.FormCreate(Sender: TObject);
var
    vst: TVirtualStringTree;
begin
    vst := VirtualStringTree1;

    vst.RootNodeCount := 5;
    vst.TreeOptions.SelectionOptions := vst.TreeOptions.SelectionOptions + [toFullRowSelect];
    vst.Header.Options := vst.Header.Options + [hoVisible];
    vst.Header.Columns.Add;
    vst.Header.Columns.Add;
    vst.Header.Columns.Add;
    vst.Header.Columns.Add;
    vst.Header.Columns.Add;
end;
delphi virtualtreeview
2个回答
1
投票

如果没有设置toAlwaysSelectNode并且在TreeOption.SelectionOptions中设置了toMultiSelect,那么这应该是开箱即用的。测试了最新的来源。

在其他情况下,只需调用ClearSelection()

procedure TVisibilityForm.VST2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if TBaseVirtualTree(Sender).GetNodeAt(Point(X, Y)) = nil then
    TBaseVirtualTree(Sender).ClearSelection();
end;

0
投票

无论设置如何,OnMouseDown中的此过程都应该有效,您只需要在toRightClickSelect中使用TreeOptions.SelectionsOptions进行右键单击选择,否则它将无法正常工作。

procedure VSTMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button in [mbLeft, mbRight] then
    VST.FocusedNode := VST.GetNodeAt(X, Y);

  if Assigned(VST.FocusedNode) then
    VST.TreeOptions.PaintOptions := VST.TreeOptions.PaintOptions - [toAlwaysHideSelection]
  else
    VST.TreeOptions.PaintOptions := VST.TreeOptions.PaintOptions + [toAlwaysHideSelection];
end;
© www.soinside.com 2019 - 2024. All rights reserved.