Delphi FMX TCheckbox/TRadiobutton自动调整大小

Delphi FMX TCheckbox/TRadiobutton自动调整大小,delphi,checkbox,firemonkey,autosize,Delphi,Checkbox,Firemonkey,Autosize,我希望动态创建具有固定宽度的复选框和单选按钮(在FMX中,而不是VCL中),以根据其包含的文本更改其高度。 我的复选框和单选按钮已启用自动换行。 所以我想得到一些类似于TLabel的东西,当AutoSize和WordWrap被启用时 我已经设法接近这一点: procedure TFMenu.Button1Click(Sender: TObject); var ctr: Integer; hostingComponent: TComponent; begin hostingCompon

我希望动态创建具有固定宽度的复选框和单选按钮(在FMX中,而不是VCL中),以根据其包含的文本更改其高度。 我的复选框和单选按钮已启用自动换行。 所以我想得到一些类似于TLabel的东西,当AutoSize和WordWrap被启用时

我已经设法接近这一点:

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;
procedure TFMenu.按钮1点击(发送方:TObject);
变量
ctr:整数;
hostingComponent:TComponent;
开始
hostingComponent:=Form1;{就我而言,是框架、面板或其他东西}
对于ctr:=0到pred(hostingComponent.ComponentCount)do
开始
如果hostingComponent.Components[ctr]是TRadioButton{或TCheckBox},则
开始
使用(hostingComponent.Components[ctr]作为TRadioButton)执行以下操作
开始
高度:=0;{如果文本或文本宽度发生变化,这将非常有用}
而(高度)*(宽度-32)

您可以使用
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以补偿实际的单选按钮。默认样式数据表明21就足够了,但为了安全起见,我在计算中添加了3。对于其他样式,此数字可能不同。请参见
TRadioButton/TCheckBox
的样式数据中
text
成员的
Position.X
属性

正如您在我的代码示例中看到的,不需要使用您使用的1.25因子来调整任何内容。我的系统是100%DPI,如果你的是125%,它可以解释你的经历。如果这仍然是一个问题,您需要检查您的程序正在运行的系统,并根据需要进行补偿

最后是一个窗体的图片,其中有两个单选按钮,宽度分别为260和400


非常感谢。这对我有用。只是出于兴趣:你怎么知道原来的单选按钮图像的宽度是24?我的DPI是100%。系数1.25是一个猜测的数字,因为我看到高度太低,1.25并没有真正解决它,只是接近了期望的输出,尽管radiobutton包含的文本越多,其高度就越高,但对于较大的文本,radiobutton的大小与文本的大小相同,对于只有3个字符的文本,radiobutton的高度仅为几像素。但是这些信息与您的解决方案无关,因为您的解决方案成功地解决了我的问题欢迎您。你怎么知道。。。可以在
TRadioButton/TCheckBox的样式数据中看到,文本成员的
Position.X
属性为21。为了安全起见,我在计算中加了3。你的问题还提醒我,如果使用的样式与默认样式不同,这些度量可能会不同,因此我编辑了答案。好的,谢谢。我问你怎么知道宽度的原因是,我的应用程序将在不同的平台上运行,用户可能启用了一些设置,使大小有所不同,所以我必须在运行时获得理想的宽度。你的回答似乎涵盖了这一点。如果我遇到一些行为不端的情况,我会让你知道的。