Firemonkeyでスクロールボックスのスクロール位置を指定する

TScrollBox,TVertScrollBox,THorzScrollBoxといったTCustomScrollBoxの派生クラスをレイアウトベースとして使う場合、スクロールの位置を知りたい場合がある。
名称にScrollが付いていないのでわかりにくい(ヘルプもわかりにくい)がViewportPositionプロパティで得ることが可能だ。

  TPointF pf = ScrollBox1->ViewportPosition;
  float fHpos = pf.X; // 水平スクロール位置
  float fVpos = pf.Y; // 垂直スクロール位置

逆にスクロール位置を指定する場合もViewportPositionで行うのが簡単だ。
水平スクロール位置をHScrollPos、垂直スクロール位置をVScrollPosとすれば以下のような感じになる。

  ScrollBox1->ViewportPosition = TPointF( HScrollPos, VScrollPos );

ScrollByメソッドは相対位置指定で、かつ逆方向なので注意が必要、絶対位置スクロールを行う場合のViewportPositionとScrollByメソッドで等価なコードを示す。

  // スクロール位置を50,50から120,120へ変更する場合のコード
  // ViewportPositionで行う場合
  ScrollBox1->ViewportPosition = TPointF( 120.0, 120.0 );

  // ScrollByで行う場合
  TPointF pf = ScrollBox1->ViewportPosition;
  ScrollBox1->ScrollBy( pf.X - 120.0, pf.Y - 120.0 );

相対位置指定の上、移動量の指定が逆方向なので現在位置からマイナスしなければならない。

スクロールの最大値は得ることができないようだが、スクロールボックス内のコンテンツの範囲を得ることで代用可能だと思う。

  TRectF rf = ScrollBox1->ContentBounds;
  float fHmax = rf.right; // 水平最大
  float fVmax = rf.bottom; // 垂直最大