虚拟树视图按像素垂直滚动,与标准Delphi网格的方式不同,TListView
和TTreeView
(或我知道的大多数其他此类控件)逐行滚动并保持在控件顶部始终可见全线。当我使用光标键进行导航时,根据方向,第一行或最后一行是完全可见的。使用鼠标滚动时无论如何都没有对齐。
例如,使用Delphi 2007和2009中的Structure窗口可以观察到此行为。
有没有办法设置许多属性以具有标准Windows控件的行为?或者是否有一组补丁来实现这一目标?
答案 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;