1. 程式人生 > >【Delphi】FMX 如何設定 TVertScrollBox的滾動位置,使其回到頂部原點

【Delphi】FMX 如何設定 TVertScrollBox的滾動位置,使其回到頂部原點

       在手機APP開發中, 縱向的滾動框非常實用,可以說是必不可少的控制元件,甚至為了自適應不同手機螢幕大小,使用滾動框是非常方便的懶人方法。

       當我們使用TVertScrollBox控制元件時,發現除了控制元件內部封裝好的自動化的觸控滾動,還有一個方法ScrollBy可以調整滾動條位置,但實際中我們發現,ScrollBy是一個增量滾動的方法,即ScrollBy(0,10)代表向上滾動10個畫素,FMX中的畫素點並不是螢幕的硬體畫素點,而是FMX內部的邏輯畫素點,通過ScrollBy方法內部原始碼也可以知道,若需要滾動到具體位置,需要設定VScrollBar.Value,如若需要讓滾動框回到頂點,可設定VScrollBar.Value:=0;  但有點奇怪,經過TVertScrollBox的封裝,VScrollBar子控制元件屬性已無法直接訪問。

       綜上,我們若需要通過程式碼設定滾動框的滾動位置,可直接使用TScrollBox,如果非要使用TVertScrollBox或已經使用又不想改,也有以下方法來設定,利用class的protected的訪問特點:

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。