TLabel.AutoSize 在 Label.Align = alTop 时不工作

TLabel.AutoSize not working when Label.Align = alTop

在 Delphi 10.4.2 32 位 Delphi VCL 应用程序中,我在 TCard 之上设置了一个 TLabel:

object lblColorTransparencyInfo: TLabel
  AlignWithMargins = True
  Left = 5
  Top = 37
  Width = 156
  Height = 20
  Margins.Left = 5
  Margins.Top = 5
  Margins.Right = 5
  Margins.Bottom = 5
  Align = alTop
  Caption = 
    'Pick a color in the image to make that color transparent in the ' +
    'whole image'
  Color = clInfoBk
  ParentColor = False
  Transparent = False
  WordWrap = True
  ExplicitTop = 0
end

Label.Color 设置为 clInfoBk,因此您可以直观地检查 Label 的大小。

然而,尽管 Label.AutoSize 设置为 True,但标签的高度远高于其文本高度,尽管 Label.AutoSize = True:

这是 TLabel.AutoSize 中的错误吗?

如何将标签高度设置为正确的文本高度? (请注意,标签的宽度可以在 运行 期间动态变化,这也会在 运行 时间内动态改变文本高度)。

这取自 TCustomLabel.AutoSize 属性 的文档:

When AutoSize is False, the label is fixed in size. When AutoSize is True, the size of the label readjusts whenever the text changes. The size of the label is also readjusts [sic] when the Font property changes.

When WordWrap is True, the width of the label is fixed. If AutoSize is also True, changes to the text cause the label to change in height. When AutoSize is True and WordWrap is False, the font determines the height of the label, and changes to the text cause the label to change in width.

它只承诺在更改文本或字体时更改大小——而不是在标签由于其父项大小调整而调整大小时。所以有人可能会争辩说这里没有错误:

但无论如何,一种非常快速且肮脏的解决方案是告诉标签在调整大小时自动调整大小。使用内插器 class,

type
  TLabel = class(Vcl.StdCtrls.TLabel)
  protected
    procedure Resize; override;
  end;

implementation

{ TLabel }

procedure TLabel.Resize;
begin
  inherited;
  AdjustBounds;
end;

我们可以让它工作(几乎):

当然,您可以通过此添加制作您自己的 TLabelEx 控件,这样您就可以像使用标准标签一样轻松地使用它。