如何进行虚拟Treeview控制以始终按行滚动?

mgh*_*hie 4 delphi virtualtreeview

虚拟树视图垂直滚动的像素,不同的方式,标准德尔福网格,TListViewTTreeView(或大部分我所知道的其他此类管制的)滚动一行,并保持全线可见在任何时候控制的顶部.当我使用光标键进行导航时,根据方向,第一行或最后一行是完全可见的.使用鼠标滚动时无论如何都没有对齐.

例如,使用Delphi 2007和2009中的Structure窗口可以观察到此行为.

有没有办法设置许多属性以具有标准Windows控件的行为?或者是否有一组补丁来实现这一目标?

Arg*_*tyr 5

您可以拦截TBaseVirtualTree.OnScroll事件并使用虚拟树视图的画布的textheight('M')返回值作为更改TBaseVirtualTree.offsety的数量,以便递增(向上滚动)或递减(向下滚动).还可以测试以确保预滚动位置模数textheight('M')为零(以避免从错误位置滚动正确的数量).

或者,Virtual Treeview论坛上的这篇文章提出了另一种方法:使用VCL滚动条隐藏虚拟树视图的本机滚动条,然后自己滚动(捕获VCL滚动事件并以编程方式滚动虚拟树视图).


mgh*_*hie 5

这就是我在Argalatyr的帮助下得出的结果,看起来它符合我的要求:

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;
Run Code Online (Sandbox Code Playgroud)