【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

相關文章
相關標籤/搜索