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
相关产品推荐
相关产品推荐

