代码之家  ›  专栏  ›  技术社区  ›  PetriW

是否可以在虚拟树视图中选择多个列?

  •  6
  • PetriW  · 技术社区  · 16 年前

    我需要添加功能来复制节点和列的矩形选择,但我找不到任何方法来实际选择虚拟树视图中的多个列(ToFullRowsSelect旁边)。

    我只是错过了什么吗?如果没有,是否有一个具有网格状多列选择支持的后代?

    3 回复  |  直到 10 年前
        1
  •  6
  •   PetriW    16 年前

    所以,经过一些测试,我想出了以下方法,感谢Digi的额外推动。DrawSelection无法使用此解决方案,因此需要禁用它。因为我认为我不需要很快再这样做,所以我没有写后代。

    将ToDisableDrawSelection、ToExtendedFocus和ToMultiSelect设置为true。

    在适当的地方声明以下变量/属性:

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

    更新以下事件:

    键控下

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

    通键

    if Key = VK_SHIFT then
      Selecting := false;
    

    聚焦改变

    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;
    

    在手机喷漆之前

    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;
    

    画图

    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;
    
        2
  •  1
  •   DiGi    16 年前

    您可以尝试启用/添加 ToGirideXTensions 在里面 树选项.错误选项 .它允许通过光标键在列中自由移动,但在离开时VT仍然取消选择列。但我确信这可以通过自定义绘制和记住起始节点和列来“修复”它。

        3
  •  1
  •   DiGi    16 年前

    再来一个提示-看 OnStATeChchange 活动,也许你可以使用

    procedure TSomeForm.VTreeStateChange(Sender: TBaseVirtualTree; Enter,Leave: TVirtualTreeStates);
    begin
      if tsDrawSelecting in Enter then
      begin
        // Save position
      end;
    end;