在手机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