题
在虚拟树状视图垂直滚动的像素,不像方式的标准的Delphi网格,TListView
和TTreeView
(或大多数,我知道的其他这样的控制的)涡旋件由线,并保持完整的线可见在的顶部控制在任何时候。当我使用光标键来浏览,则根据方向的第一或最后一行是完全可见。当使用鼠标的滚动,没有任何对准
此行为可以例如观察到在2007年Delphi和2009 Structure窗口。
有什么办法来设置许多属性有标准Windows控件的行为?或者是有一组补丁的地方来实现这一目标?
解决方案
您可以拦截TBaseVirtualTree.OnScroll事件并使用的textHeight虚拟树视图的画布的返回值(“M”)作为量来改变TBaseVirtualTree.offsety为了递增(向上滚动)或递减(向下滚动)。也可以测试,以确保预滚动位置模量textHeight不同(“M”)是零(由适量避免滚动从错误的位置)。
可替换地,上虚拟树状视图此帖子论坛建议另一种方法:隐藏与VCL滚动条虚拟TreeView的本土滚动条,然后做自己的滚动(捕捉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;
不隶属于 StackOverflow