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?

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top