2009-01-29 14 views
6

Necesito agregar funcionalidad para copiar una selección rectangular de nodos y columnas, pero no puedo encontrar ninguna manera de seleccionar varias columnas en una vista de árbol virtual (al lado de aFullRowSelect).¿Es posible seleccionar varias columnas en Virtual Treeview?

¿Me falta algo? Y si no, ¿hay un descendiente por ahí con soporte de selección de multicolumnas cuadriculadas?

Respuesta

6

Así que después de algunas pruebas, se me ocurrió lo siguiente, gracias DiGi por el impulso extra. DrawSelection no funcionará con esta solución, por lo que debe deshabilitarse. Como no creo que tenga que volver a hacer esto pronto, no escribí un descendiente.

Establezca toDisableDrawSelection, toExtendedFocus y toMultiSelect to True.

Declarar las siguientes variables/propiedades de un sitio apropiado:

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

Actualizar los siguientes eventos:

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; 

En FocusChanged

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; 
1

Usted puede tratar de activar/agregar toGridExtensions en TreeOptions.MiscOptions. Permite el movimiento libre en columnas con las teclas del cursor, pero VT todavía anula la selección de la columna al salir. Pero estoy seguro de que es posible "arreglarlo" dibujando a medida y recordando comenzar nodo y columna.

+0

tengo intenté esto y no funciona muy bien cuando quieres usar un mouse. Sin embargo, "resuelve" el problema tan arriba. :) – PetriW

1

Una más punta - mira OnStateChange caso, tal vez usted puede utilizar

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

Interesante, lo vere luego. :) ¡Gracias! – PetriW