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

К сожалению, «из коробки» такое выделение не доступно, поэтому пришлось написать для этого класс — 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
Сабж. Как можно реализовать выделение ячеек колонок? а то по-умолчанию выделяются только названия самих нодов.
Спасибо за вопрос, подумаю. Следите за обновлениями