Is it possible to select multiple columns in Virtual Treeview?

I need to add functionality to copy a rectangular selection of nodes and columns, but I can't find any way to actually select multiple columns in a Virtual Treeview (beside toFullRowSelect).

Am I just missing something? And if not, is there a descendant out there with grid-like multicolumn select support?


So after some testing I came up with the following, thanks DiGi for the extra push. DrawSelection won't work with this solution so it needs to be disabled. Since I don't think I'll need to do this again soon I didn't write a descendant.

Set toDisableDrawSelection, toExtendedFocus and toMultiSelect to True.

Declare the following variables/properties somewhere suitable:

StartSelectedColumn: integer;
FirstSelectedColumn: integer;
LastSelectedColumn: integer;
Selecting: boolean;

Update the following events:

OnKeyDown

if (not Selecting) and (Key = VK_SHIFT) then
begin
  StartSelectedColumn := vtMain.FocusedColumn;
  FirstSelectedColumn := StartSelectedColumn;
  LastSelectedColumn := StartSelectedColumn;
  Selecting := true;
end;

OnKeyUp

if Key = VK_SHIFT then
  Selecting := false;

OnFocusChanged

if Selecting then
begin
  if column < StartSelectedColumn then
  begin
    FirstSelectedColumn := column;
    LastSelectedColumn := StartSelectedColumn;
  end
  else if column > StartSelectedColumn then
  begin
    FirstSelectedColumn := StartSelectedColumn;
    LastSelectedColumn := column
  end
  else
  begin
    FirstSelectedColumn := column;
    LastSelectedColumn := column;
  end;
end
else
begin
  StartSelectedColumn := column;
  FirstSelectedColumn := column;
  LastSelectedColumn := column;
end;

OnBeforeCellPaint

if vtMain.Selected[node] and InRange(column, FirstSelectedColumn, LastSelectedColumn) then
begin
  if vtMain.Focused then
    TargetCanvas.Brush.Color := vtMain.Colors.FocusedSelectionColor
  else
    TargetCanvas.Brush.Color := vtMain.Colors.UnfocusedSelectionColor;
  TargetCanvas.Brush.Style := bsSolid;
  TargetCanvas.FillRect(CellRect);
end;

OnPaintText

if vtMain.Selected[node] and InRange(column, FirstSelectedColumn, LastSelectedColumn) then
begin
  if vtMain.Focused then
    TargetCanvas.Font.Color := clHighlightText
  else
    TargetCanvas.Font.Color := vtMain.Font.Color;
end;

You can try enable/add toGridExtensions in TreeOptions.MiscOptions. It enables free moving in columns by cursor keys, but VT still deselect column on leaving. But I'm sure that is possible to "fix" it by custom draw and remembering starting node and column.


还有一点 - 看看OnStateChange事件,也许你可以使用

procedure TSomeForm.VTreeStateChange(Sender: TBaseVirtualTree; Enter,Leave: TVirtualTreeStates);
begin
  if tsDrawSelecting in Enter then
  begin
    // Save position
  end;
end;
链接地址: http://www.djcxy.com/p/34978.html

上一篇: 通过Web运行ActiveX

下一篇: 是否有可能在Virtual Treeview中选择多个列?