È possibile selezionare più colonne in Treeview virtuale?
-
20-08-2019 - |
Domanda
Devo aggiungere funzionalità per copiare una selezione rettangolare di nodi e colonne, ma non riesco a trovare alcun modo per selezionare effettivamente più colonne in un Treeview virtuale (accanto a FullRowSelect).
Mi sto perdendo qualcosa? E se no, c'è un discendente là fuori con supporto di selezione a più colonne simile a una griglia?
Soluzione
Quindi dopo alcuni test ho pensato a quanto segue, grazie DiGi per la spinta in più. DrawSelection non funzionerà con questa soluzione, quindi deve essere disabilitato. Dal momento che non credo che dovrò farlo di nuovo presto, non ho scritto un discendente.
Impostare suDisableDrawSelection, suExtendedFocus e suMultiSelect su True.
Dichiara le seguenti variabili / proprietà adatte:
StartSelectedColumn: integer;
FirstSelectedColumn: integer;
LastSelectedColumn: integer;
Selecting: boolean;
Aggiorna i seguenti eventi:
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;
Altri suggerimenti
Puoi provare ad abilitare / aggiungere toGridExtensions in TreeOptions.MiscOptions . Consente lo spostamento libero nelle colonne con i tasti cursore, ma VT deseleziona comunque la colonna all'uscita. Ma sono sicuro che è possibile & Quot; correggere & Quot; tramite disegno personalizzato e ricordando il nodo e la colonna iniziali.
Un altro consiglio: guarda l'evento OnStateChange , forse puoi usare
procedure TSomeForm.VTreeStateChange(Sender: TBaseVirtualTree; Enter,Leave: TVirtualTreeStates);
begin
if tsDrawSelecting in Enter then
begin
// Save position
end;
end;