É possível selecionar múltiplas colunas no Virtual TreeView?
-
20-08-2019 - |
Pergunta
Eu preciso adicionar funcionalidade de copiar uma seleção retangular de nós e colunas, mas não consigo encontrar alguma maneira de realmente selecionar várias colunas em um TreeView Virtual (ao lado toFullRowSelect).
Am I apenas faltando alguma coisa? E se não, há um descendente lá fora, com grade-like selecione suporte várias colunas?
Solução
Então, depois de alguns testes que eu vim com o seguinte, graças DiGi para o impulso extra. DrawSelection não funcionará com esta solução para que ele precisa ser desativado. Desde que eu não acho que vou precisar fazer isso novamente em breve eu não escrevi um descendente.
Set toDisableDrawSelection, toExtendedFocus e toMultiSelect para True.
Declare as seguintes variáveis ??/ Propriedades lugar adequado:
StartSelectedColumn: integer;
FirstSelectedColumn: integer;
LastSelectedColumn: integer;
Selecting: boolean;
Atualize os seguintes 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;
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;
Outras dicas
Você pode tentar ativar / add toGridExtensions em TreeOptions.MiscOptions . Ele permite movimento livre em colunas de teclas de cursor, mas VT coluna ainda desmarcar em sair. Mas tenho certeza de que é possível "solução" que por desenhar e lembrando começando nó e coluna personalizada.
Mais uma dica - olhada OnStateChange caso, talvez você possa usar
procedure TSomeForm.VTreeStateChange(Sender: TBaseVirtualTree; Enter,Leave: TVirtualTreeStates);
begin
if tsDrawSelecting in Enter then
begin
// Save position
end;
end;