Расширенное выделение ячеек в TVirtualStringTree

Приветствую всех пользователей компонента — виртуального дерева VirtualTree.
У меня возникла необходимость выделять элементы «как в Экселе» — то есть реализовать множественное выделение мышью и клавишами.

Расширенное множественное выделение элементов в TVirtualStringTree

К сожалению, «из коробки» такое выделение не доступно, поэтому пришлось написать для этого класс — TTreeSelection.

Подключение к вашему проекту

Допустим, у вас на форме TForm2 лежит контрол VirtualStringTree с именем treeMain.

procedure TForm2.FormCreate(Sender: TObject);
begin
 treeMain.RootNodeCount := 20;
 FVTSelection := TTreeSelection.Create(treeMain);
end;

procedure TForm2.FormDestroy(Sender: TObject);
 begin
   FreeAndNil(FVTSelection);
end;

Также нам необходимо организовать передачу движений мыши и нажатия клавиш:

procedure TForm2.treeMainKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  FVTSelection.KeyPress(Key, Shift);
end;

procedure TForm2.treeMainMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FVTSelection.MouseDown(X, Y, Shift);
end;

procedure TForm2.treeMainMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  FVTSelection.MouseMove(X, Y, Shift);
end;

procedure TForm2.treeMainMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FVTSelection.MouseUp(X, Y, Shift);
end;

И, наконец, нужно рисовать выделение необходимых ячеек самим т.к. компонент не рисует как нам надо:

procedure TForm2.treeMainPaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType);
begin
  if FVTSelection.IsSelectionActive and (not IsWinVistaOrAbove) then
  begin
    if FVTSelection.IsInSelection(Node.Index, Column) then
      TargetCanvas.Font.Color := clWhite;
  end;
end;

Получение выделенных ячеек

function TTreeSelection.IsInSelection(ARow, AColumn: Integer): boolean;

Скачать

Для получения статуса ячейки, передайте ее координаты в виде Row, Column (строка, столбец) в функцию

Загрузить архив с тестовым проектом и модулем VirtualTreesHelper.pas можно по ссылке ниже. Необходим установленный компонент VirtualTreeView https://github.com/TurboPack/VirtualTreeView

У этой записи 2 комментариев

  1. Олег

    Сабж. Как можно реализовать выделение ячеек колонок? а то по-умолчанию выделяются только названия самих нодов.

    1. Роман Иш

      Спасибо за вопрос, подумаю. Следите за обновлениями

Добавить комментарий