繁体   English   中英

Delphi FMX TCheckbox / TRadiobutton自动调整大小

[英]Delphi FMX TCheckbox/TRadiobutton Autosize

我想动态创建具有固定宽度的复选框和单选按钮(在FMX中,不是VCL),以根据其包含的文本更改其高度。 我的复选框和单选按钮启用了WordWrap。 因此,当启用AutoSize和WordWrap时,我想获得类似于TLabel的功能。

我已经设法接近:

procedure TFMenu.Button1Click(Sender: TObject);
var
  ctr: Integer;
  hostingComponent: TComponent;
begin
  hostingComponent := Form1; { in my case a Frame or Panel or sth. }
  for ctr := 0 to pred(hostingComponent.ComponentCount) do
  begin
    if hostingComponent.Components[ctr] is TRadioButton { or TCheckBox } then
    begin
      with (hostingComponent.Components[ctr] as TRadioButton) do
      begin
        Height := 0; { if text or text Width changes this is useful }
        while (Height) * (Width - 32)
        <=
        (Canvas.TextHeight(Text) * 1.25 ) * Canvas.TextWidth(Text) do
        begin
          Height := Height + 1;
        end;
      end;
    end;
  end;
end;

对于20到150个字符之间的文本,这可以接受 ,但是我知道这是非常错误的,我也不知道我在这里缺少什么。 Canvas.TextHeight乘以1.25使文本看起来适合上面提到的长度,但是我不知道为什么。 Width - 32是因为复选框/单选按钮的图像大小,而不是我要处理的文本。 (我猜32是正确的,实际情况可能有所不同)

所以我的问题是如何 根据包含的文本 更改这些组件的高度

另外:如何更改代码以按预期工作。 它后面的数学运算(除以猜测值1.25的乘积除外)应该是正确的,但是我使用的区域似乎是错误的,因为Checkbox / Radiobutton的区域并不完全包含文本,而是以一些自由空间作为文本结尾不是障碍,而只是左边界,但是我不确定这是否重要或如何处理。

您可以使用Canvas.MeasureText()方法测量文本,然后设置TRadioButton的大小。

例如:

procedure TForm22.Button1Click(Sender: TObject);
var
  r: TRectF;
begin
  rb1:= TRadioButton.Create(self);
  rb1.Parent := self;
  rb1.Position.X := 100;
  rb1.Position.Y := 8;
  rb1.Size.Height := 17;
  rb1.Size.Width := 260;

  rb1.StyledSettings := [];
  rb1.TextSettings.Font.Size := 18;
  rb1.TextSettings.WordWrap := True;
  rb1.Canvas.Font.Size := rb1.TextSettings.Font.Size;

  r := RectF(0, 0, rb1.Size.Width-24, 10000);
  rb1.Canvas.MeasureText(r, s, True, [], TTextAlign.Leading, TTextAlign.Leading);

  rb1.Size.Height := r.Bottom;
  rb1.Text := s;
end;

ARect (var)参数指定文本的边界矩形。 该功能使文本适合矩形内部(如果可能)。 通过指定宽度限制,但高度足够大,该函数将遵守宽度并测量所需的高度(在返回的TRectF修改)。

在我的示例中,我从TRadioButton宽度中减去了24,以补偿实际的TRadioButton按钮。 默认样式数据表示21就足够了,但在计算中我加了3表示安全。 对于其他样式,此数字可能会有所不同。 Position.X的财产text的样式数据成员TRadioButton/TCheckBox

正如您在我的代码示例中看到的那样,无需使用您使用的1.25系数进行任何调整。 我的系统的DPI为100%,如果您的系统为125%,则可以解释您的经验。 如果仍然存在问题,则需要检查正在运行程序的系统并根据需要进行补偿。

最后是一张带有2个单选按钮的表格图片,两个单选按钮的宽度分别为260和400。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM