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

时间:2009-05-30 11:47:16

标签: delphi virtualtreeview

虚拟树视图按像素垂直滚动,与标准Delphi网格的方式不同,TListViewTTreeView(或我知道的大多数其他此类控件)逐行滚动并保持在控件顶部始终可见全线。当我使用光标键进行导航时,根据方向,第一行或最后一行是完全可见的。使用鼠标滚动时无论如何都没有对齐。

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

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

2 个答案:

答案 0 :(得分:5)

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

或者,Virtual Treeview论坛上的this post建议另一种方法:使用VCL滚动条隐藏虚拟树视图的本机滚动条,然后自己滚动(捕获VCL滚动事件并以编程方式滚动虚拟树视图)。

答案 1 :(得分: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;