与标准 Delphi 网格的方式不同,Virtual Treeview 按像素垂直滚动,TListView
并且TTreeView
(或我知道的大多数其他此类控件)逐行滚动并始终在控件顶部保持整行可见。当我使用光标键导航时,根据方向,第一行或最后一行完全可见。用鼠标滚动时,没有任何对齐。
例如,可以通过 Delphi 2007 和 2009 中的结构窗口观察到这种行为。
有没有办法设置许多属性以具有标准 Windows 控件的行为?或者是否有一组补丁可以实现这一目标?
与标准 Delphi 网格的方式不同,Virtual Treeview 按像素垂直滚动,TListView
并且TTreeView
(或我知道的大多数其他此类控件)逐行滚动并始终在控件顶部保持整行可见。当我使用光标键导航时,根据方向,第一行或最后一行完全可见。用鼠标滚动时,没有任何对齐。
例如,可以通过 Delphi 2007 和 2009 中的结构窗口观察到这种行为。
有没有办法设置许多属性以具有标准 Windows 控件的行为?或者是否有一组补丁可以实现这一目标?
这是我在 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;
您可以拦截 TBaseVirtualTree.OnScroll 事件并使用虚拟树视图的画布的 textheight('M') 返回值作为更改 TBaseVirtualTree.offsety 的量,以便增加(向上滚动)或减少(向下滚动)。还可以测试以确保预滚动位置模数 textheight('M') 为零(以避免从错误位置滚动正确的量)。
或者,虚拟树视图论坛上的这篇文章提出了另一种方法:使用 VCL 滚动条隐藏虚拟树视图的本机滚动条,然后自己进行滚动(捕获 VCL 滚动事件并以编程方式滚动虚拟树视图)。