• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

【Delphi】FMX如何设置TVertScrollBox的滚动位置,使其回到顶部原点 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

       在手机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冲突的问题。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab中的actxserver运用发布时间:2022-07-18
下一篇:
java调用matlab生成exe文件 - 夜里码码发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap