Pergunta

O Virtual Treeview rola verticalmente por pixels, ao contrário da forma como o Delphi padrão grades, TListView e TTreeView (ou a maioria dos outros tais controles que estou ciente de) rolagem por linha e manter uma linha completa visível na parte superior da controlar em todos os momentos. Quando eu use as teclas do cursor para navegar, em seguida, dependendo da direção a primeira ou a última linha é completamente visível. Ao rolar com o mouse não há qualquer alinhamento.

Este comportamento pode ser observado, por exemplo, com a janela de Estrutura em Delphi 2007 e 2009.

Existe alguma maneira para definir as muitas propriedades que ter o comportamento dos controles padrão do Windows? Ou há um conjunto de patches em algum lugar para conseguir isso?

Foi útil?

Solução

Você poderia interceptar o evento TBaseVirtualTree.OnScroll e usar o valor de retorno da tela de TreeView virtual para textHeight ( 'M') como o montante a mudança TBaseVirtualTree.offsety, a fim de incremento (rolar para cima) ou diminuir (rolar para baixo). Poderia também teste para garantir que textHeight posição pré-scroll módulo ( 'M') é zero (para evitar a rolagem pela quantidade certa de posição errada).

Como alternativa, este post sobre o Virtual Treeview Fórum sugere outra abordagem: esconder as barras de rolagem nativas do treeview virtual com barras VCL de rolagem e, em seguida, fazer a rolagem yourself (prendendo eventos VCL rolagem e programaticamente rolagem do treeview virtual).

Outras dicas

Isto é o que eu vim com a ajuda de Argalatyr, parece que ele faz o que eu quero que ele:

procedure TForm1.FormCreate(Sender: TObject);
begin
  VirtualStringTree1.ScrollBarOptions.VerticalIncrement :=
    VirtualStringTree1.DefaultNodeHeight;
end;

procedure TForm1.VirtualStringTree1Resize(Sender: TObject);
var
  DY: integer;
begin
  with VirtualStringTree1 do begin
    DY := VirtualStringTree1.DefaultNodeHeight;
    BottomSpace := ClientHeight mod DY;
    VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
  end;
end;

procedure TForm1.VirtualStringTree1Scroll(Sender: TBaseVirtualTree; DeltaX,
  DeltaY: Integer);
var
  DY: integer;
begin
  if DeltaY <> 0 then begin
    DY := VirtualStringTree1.DefaultNodeHeight;
    VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
  end;
end;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top