Ist es möglich, mehrere Spalten in Virtual Treeview zu wählen?
-
20-08-2019 - |
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?
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;