¿Cómo se puede hacer el control Treeview virtual para desplazarse por las líneas siempre?

StackOverflow https://stackoverflow.com/questions/929600

  •  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?

¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top