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

FMX中动态创建旋转TText在嵌套TLayout偏移问题求助

FMX动态创建旋转控件的文本偏移问题

问题现象

  • 动态创建带180°旋转的TText控件,放入同角度旋转的TRectangle内时,文本会显示到矩形外部;但将对应的FMX代码直接粘贴到Delphi窗体设计器中,#45文本能正常居中显示。
  • 生成矩形的代码为专有复杂实现,无法提供简化示例。
  • 单个TLayout父控件下动态创建多个此类控件时,文本可正常居中;但在两层嵌套的默认TLayout下创建时,TText会出现偏移,其余设置完全一致,疑似FMX布局渲染的特性/BUG问题。
  • 已尝试的无效方案:调用TLayout.Repaint强制刷新、调整RotationAngle与文本内容的设置顺序。

相关FMX代码

object Layout1: TLayout
  Align = Client
  TabOrder = 8
  object Layout2: TLayout
    TabOrder = 9
    object MyRect: TRectangle
      Fill.Color = claLightgray
      Position.X = 151.18110656738280000
      Position.Y = 75.59055328369140000
      RotationAngle = 180.00000000000000000
      RotationCenter.X = 0.00000000000000000
      RotationCenter.Y = 0.00000000000000000
      Size.Width = 30.00000000000000000
      Size.Height = 25.00000000000000000
      Size.PlatformDefault = False
      object TRectangle
        Align = Bottom
        Fill.Color = claDimgray
        Size.Width = 50.00000000000000000
        Size.Height = 5.00000000000000000
        Size.PlatformDefault = False
        Stroke.Kind = None
      end
      object TText
        Align = Client
        RotationAngle = 180.00000000000000000
        Text = '#45'
        TextSettings.Font.Size = 10.00000000000000000
      end
    end
  end
end

可行解决方案尝试

  • 强制触发布局更新:动态创建完成后,递归调用父控件的UpdateLayout方法,确保布局重新计算:
    MyRect.UpdateLayout(True);
    Layout2.UpdateLayout(True);
    Layout1.UpdateLayout(True);
    
    也可单独调用TText的InvalidateRect,强制控件重新绘制区域。
  • 调整旋转属性设置顺序:先确定控件尺寸,再设置旋转中心,最后设置旋转角度,避免布局计算基于未确定的尺寸:
    // 动态创建TText示例
    MyText := TText.Create(MyRect);
    MyText.Align := TAlignLayout.Client;
    MyText.Text := '#45';
    MyText.TextSettings.Font.Size := 10;
    // 先绑定父容器尺寸
    MyText.Size := MyRect.ClientSize;
    // 设置旋转中心为自身中心
    MyText.RotationCenter := TPointF.Create(MyText.Width/2, MyText.Height/2);
    // 最后设置旋转角度
    MyText.RotationAngle := 180;
    
  • 显式设置嵌套Layout属性:给内层Layout2设置明确的Align或Size,避免默认属性导致的布局偏差,比如Layout2.Align := TAlignLayout.Client。
  • 手动计算文本居中位置:若自动布局失效,直接计算TText的居中坐标并强制设置:
    var
      TextBounds: TRectF;
    begin
      TextBounds := MyText.TextBounds;
      // 基于父矩形的Client区域计算居中
      MyText.Position.X := (MyRect.ClientWidth - TextBounds.Width) / 2;
      MyText.Position.Y := (MyRect.ClientHeight - TextBounds.Height) / 2;
      MyText.Invalidate;
    end;
    
  • 升级FMX版本:此类布局渲染问题常被后续Delphi版本修复,检查并升级到最新可用的Delphi版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:45:16