¿Cómo se puede hacer el control Treeview virtual para desplazarse por las líneas siempre?
-
06-09-2019 - |
Pregunta
Los Treeview rollos virtuales verticalmente por píxeles, a diferencia de la forma en que el estándar de Delphi rejillas, TListView
y TTreeView
(o la mayoría de los otros dichos controles que yo sepa) de desplazamiento por línea y mantener una línea completa visible en la parte superior de la control en todo momento. Cuando utilizo las teclas de cursor para navegar, a continuación, dependiendo de la dirección de la primera o la última línea es completamente visible. Al desplazarse con el ratón no hay alineamiento absoluto.
Este comportamiento se puede observar, por ejemplo, con la ventana Estructura Delphi 2007 y 2009.
¿Hay alguna manera de establecer las muchas propiedades a tener el comportamiento de los controles estándar de Windows? ¿O hay un conjunto de parches en alguna parte para lograr esto?
Solución
Se puede interceptar el evento TBaseVirtualTree.OnScroll y utilizar el valor de la lona de la vista de árbol virtual de cambio de textheight ( 'M') como la cantidad de cambiar TBaseVirtualTree.offsety con el fin de incrementar (desplazarse hacia arriba) o decremento (desplácese hacia abajo). también pudo hacer la prueba para asegurar que pre-scroll posición módulo textheight ( 'M') es cero (para evitar el desplazamiento por la cantidad derecha desde la posición incorrecta).
Alternativamente, este post en el Treeview Virtual foro sugiere otro enfoque: ocultar las barras de desplazamiento nativos de la vista de árbol virtual con barras de desplazamiento VCL y luego hacer el desplazamiento a ti mismo (que atrapan eventos de desplazamiento VCL y programación desplazando la vista de árbol virtual).
Otros consejos
Esto es lo que ocurrió con la ayuda de Argalatyr, parece que hace lo que yo quiero que:
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;