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