Como pode controle TreeView Virtual ser feita para sempre rolar por linhas?
-
06-09-2019 - |
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?
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;