zoukankan      html  css  js  c++  java
  • 【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。

         另外,如果不想使用上面的方法,也可以其他方法:

        1)使用TVertScrollBox自带的ViewportPositionChange事件,记录NewViewportPosition.Y值,再使用ScrollBy(0, Y);来设置,相对比较麻烦;

        2)使用class helper,同样可以访问protect段,但需要注意和其他helper冲突的问题。

  • 相关阅读:
    Codeforces Round 546 (Div. 2)
    Codeforces Round 545 (Div. 2)
    Codeforces Round 544(Div. 3)
    牛客小白月赛12
    Codeforces Round 261(Div. 2)
    Codeforces Round 260(Div. 2)
    Codeforces Round 259(Div. 2)
    Codeforces Round 258(Div. 2)
    Codeforces Round 257 (Div. 2)
    《A First Course in Probability》-chaper5-连续型随机变量-随机变量函数的分布
  • 原文地址:https://www.cnblogs.com/caibirdy1985/p/9825110.html
Copyright © 2011-2022 走看看