如何使虚拟TreeView控件始终按行滚动?

虚拟TTreeView按像素垂直滚动,与标准Delphi网格, TListViewTTreeView (或我知道的大多数其他此类控件)的方式不同,它们按行滚动,并在控件的顶部保留一整行倍。 当我使用光标键导航时,根据方向,第一行或最后一行是完全可见的。 当用鼠标滚动时,没有任何对齐。

例如,Delphi 2007和2009中的结构窗口可以观察到这种行为。

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


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

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


这是我在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;
链接地址: http://www.djcxy.com/p/34991.html

上一篇: How can Virtual Treeview control be made to always scroll by lines?

下一篇: Virtual TreeView hint not showing