【Delphi】FMX 如何设置 TVertScrollBox的滚动位置,使其回到顶部原点

       在手机APP开发中, 纵向的滚动框很是实用,能够说是必不可少的控件,甚至为了自适应不一样手机屏幕大小,使用滚动框是很是方便的懒人方法。spa

       当咱们使用TVertScrollBox控件时,发现除了控件内部封装好的自动化的触控滚动,还有一个方法ScrollBy能够调整滚动条位置,但实际中咱们发现,ScrollBy是一个增量滚动的方法,即ScrollBy(0,10)表明向上滚动10个像素,FMX中的像素点并非屏幕的硬件像素点,而是FMX内部的逻辑像素点,经过ScrollBy方法内部源码也能够知道,若须要滚动到具体位置,须要设置VScrollBar.Value,如若须要让滚动框回到顶点,可设置VScrollBar.Value:=0;  但有点奇怪,通过TVertScrollBox的封装,VScrollBar子控件属性已没法直接访问。code

       综上,咱们若须要经过代码设置滚动框的滚动位置,可直接使用TScrollBox,若是非要使用TVertScrollBox或已经使用又不想改,也有如下方法来设置,利用class的protected的访问特色:blog

type
  TScrollBoxPatch = class(TVertScrollBox);
procedure TfmMain.btnSetVScrollPosClick(Sender: TObject);
begin
  TScrollBoxPatch(loScrollBox).VScrollBar.Value := 0;
end;

    上面技巧可应用于在不一样单元须要访问protected方法或属性的类,解决没法调用“因控件封装时一些没有暴露的方法”的问题。事件

    原理上是由于通过 TScrollBoxPatch = class(TVertScrollBox)定义以后,TScrollBoxPatch 和 TVertScrollBox在内存结构上是没有区别的,而因为TScrollBoxPatch在当前单元定义,因此当前单元也具备访问TScrollBoxPatch及其父类的protected定义段的方法或属性的权限,所以,TScrollBoxPatch.VScrollBar即等同于使用TVertScrollBox的父类TCustomScollBar.VScrollBar。内存

 

     另外,若是不想使用上面的方法,也能够其余方法:开发

    1)使用TVertScrollBox自带的ViewportPositionChange事件,记录NewViewportPosition.Y值,再使用ScrollBy(0, Y);来设置,相对比较麻烦;源码

    2)使用class helper,一样能够访问protect段,但须要注意和其余helper冲突的问题。it

相关文章
相关标签/搜索