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?

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top