Как ничего не выбрать, нажав на пустой фон? - PullRequest
3 голосов
/ 22 марта 2019

У меня есть виртуальное древовидное представление (например, TVirtualStringTree).

  • Пользователь может выбрать строку
  • , но было бы неплохо, если бы он мог сделать интуитивно понятное нажатие "никуда" , чтобы выбрать не строку

enter image description here

Примечание. Конечно, мультиселект выключен;потому что они могут выбрать только ноль или один элемент

MCRE:

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;

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Это должно работать "из коробки", если toAlwaysSelectNode не установлен и toMultiSelect установлен в TreeOption.SelectionOptions. Проверено с последним источником.

В остальных случаях просто позвоните 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 голосов
/ 25 марта 2019

Эта процедура в 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;
...