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