Frage

Ich brauche Funktionalität hinzufügen, um eine rechteckige Auswahl von Knoten und Spalten zu kopieren, aber ich kann jede mögliche Weise nicht finden, um tatsächlich mehrere Spalten in einer virtuellen Treeview zu wählen (neben toFullRowSelect).

Fehle ich gerade etwas? Und wenn nicht, gibt es einen Nachkommen da draußen mit gitterartigen mehrspaltigen Unterstützung wählen?

War es hilfreich?

Lösung

So, nachdem einige Tests ich mit den folgenden, dank DiGi für die zusätzlichen Push kam. DrawSelection wird nicht mit dieser Lösung arbeiten, so muss es deaktiviert sein. Da ich nicht glaube, ich werde dies wieder tun muß, bald habe ich nicht einen Nachkommen schreiben.

Stellen toDisableDrawSelection, toExtendedFocus und toMultiSelect auf True fest.

Deklarieren Sie die folgenden Variablen / Eigenschaften irgendwo geeignet:

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

Aktualisieren Sie die folgenden Ereignisse:

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;

Andere Tipps

Sie können versuchen, aktivieren / add toGridExtensions in TreeOptions.MiscOptions . Es ermöglicht frei beweglich in den Spalten von Cursor-Tasten, aber VT noch Spalte deaktivieren beim Verlassen. Aber ich bin sicher, dass es möglich ist zu „reparieren“ es durch individuelle ziehen und die Erinnerung Knoten und Spalte beginnen.

Und noch ein Tipp - Blick auf OnStateChange Veranstaltung, vielleicht können Sie

procedure TSomeForm.VTreeStateChange(Sender: TBaseVirtualTree; Enter,Leave: TVirtualTreeStates);
begin
  if tsDrawSelecting in Enter then
  begin
    // Save position
  end;
end;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top