【问题标题】:Firemonkey: How to align properly label on the right?Firemonkey:如何正确对齐右侧的标签?
【发布时间】:2017-05-20 10:37:05
【问题描述】:

如果我这样做了

RectangleCont.beginUpdate;

myText1 := TText.Create(RectangleCont);
myText1.parent := RectangleCont;
myText1.text := 'a long text'; 
myText1.Position.x := RectangleCont.width - myText1.width; // 150px for exemple
myText1.align := TalignLayout.right;

myText2 := TText.Create(RectangleCont);
myText2.parent := RectangleCont;
myText2.text := 'OK';
myText2.Position.x := RectangleCont.width - myText1.width - myText2.width; // 50px for exemple
myText2.align := TalignLayout.right;

myText3 := TText.Create(RectangleCont);
myText3.parent := RectangleCont;
myText3.text := 'OK';
myText3.Position.x := RectangleCont.width - myText1.width - myText2.width - myText3.width; // 0px for exemple
myText3.align := TalignLayout.right;

RectangleCont.EndUpdate;

我将使用<myText1><myText3><myText2> 而不是<myText3><myText2><myText1>

注意:如果我在myText1.text 中输入较短的文本,那么它可以正常工作。

有什么解决办法吗?

【问题讨论】:

  • 尝试使用myText1.align := TAlignLayout.MostRight
  • 同样设置位置是没有意义的,因为自动对齐会覆盖它。
  • 是的,我知道 TAlignLayout.MostRight,但是如果我有 3 个文本怎么办? myText1、myText2 和 myText3 ?通常情况下(我认为是这种情况,否则在delphi中是一个大错误)在正常的世界设置位置一定不是没有意义的,因为必须针对控件的原始位置进行对齐
  • 好的,FMX 有一些不正确的逻辑,确实依赖于原始 x 位置加上控制宽度。看看 FMX.Types AlignObjects 过程 - 特别是 InsertBefore 函数。如果您无法正确对齐所有这些控件,则只能手动设置或使用其他容器,因此您始终只有两个必须对齐的处于同一级别的控件。
  • 谢谢,是的,我认为在东京这比在柏林还要糟糕:( quality.embarcadero.com/browse/RSP-17172 ...

标签: delphi firemonkey


【解决方案1】:

Delphi Align 属性适用于大多数情况,但是当您有更罕见的需求时,编写自己的调整大小事件并不难。只需跳过在代码中设置 AlignPosition 属性,而是使用此代码(它未经测试,但我想你明白了,以防我忘记了什么):

...
RectangleCont.OnResize := DoResizeRectangle;
...


procedure TMainForm.DoResizeRectangle(aSender: TObject);
var lParent: TControl;
begin
  lParent := TControl(aSender);
  myText1.Height := lParent.Height;
  myText2.Height := lParent.Height;
  myText3.Height := lParent.Height;
  myText1.Position.Point := PointF(lParent.Width-myText1.Width, 0);
  myText2.Position.Point := PointF(myText1.Position.X-myText2.Width, 0);
  myText3.Position.Point := PointF(myText2.Position.X-myText3.Width, 0);
end;

【讨论】:

    【解决方案2】:
    myText1.align := TalignLayout.left;
    myText2.align := TalignLayout.right;
    myText1.align := TalignLayout.right;
    

    【讨论】:

    • 不,这不起作用,因为容器在 beginupdate 中
    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 2016-09-26
    • 1970-01-01
    • 2012-11-23
    • 2014-07-18
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多