You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FireMonkey窗体TButton在Android不显示:Form.ClientWidth设置问题

为什么FireMonkey中Form1->ClientWidth设置按钮宽度在Android上失效?

这事儿本质是FireMonkey在iOS和Android平台上的窗体初始化时序差异搞的鬼,我来给你掰扯清楚:

  • FormShow事件的触发时机问题
    在iOS平台上,当FormShow事件触发时,窗体已经完成了全部布局计算,Form1->ClientWidth能拿到当前窗体实际可用的宽度值,乘以0.8后按钮宽度是合理的,自然能正常显示。
    但在Android上,FormShow触发得太早了——此时窗体还没完成最终的布局渲染,Form1->ClientWidth大概率返回的是初始默认值(比如0或者一个极小的数值)。你想想,按钮宽度被设成接近0的大小,可不就完全看不到了嘛。

  • Screen->Width为啥能通用?
    Screen->Width获取的是设备屏幕的逻辑宽度,这个值在应用启动后很快就会被系统正确初始化,完全不受窗体布局进度的影响。不管窗体有没有完成布局,这个值都是有效的,所以乘以0.8后能得到一个合理的宽度,按钮在两个平台上都能正常显示。

  • 更靠谱的布局方案
    其实直接用Screen->Width不是最优解——毕竟不同Android设备的状态栏、导航栏会占用屏幕空间,导致窗体实际可用区域比屏幕宽度小,按钮可能会超出显示范围。更稳妥的做法是监听窗体的OnResize事件,在这个事件里调整按钮宽度:

    void __fastcall TForm1::FormResize(TObject *Sender)
    {
        Button1->Width = Form1->ClientWidth * 0.8;
    }
    

    因为OnResize是在窗体布局完成、尺寸完全确定后才会触发的,此时ClientWidth的值绝对准确,不管iOS还是Android都能完美适配。

内容的提问来源于stack exchange,提问作者relayman357

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:11:01