Delphi FMX TCheckbox/TRadiobutton自动调整大小
我希望动态创建具有固定宽度的复选框和单选按钮(在FMX中,而不是VCL中),以根据其包含的文本更改其高度。 我的复选框和单选按钮已启用自动换行。 所以我想得到一些类似于TLabel的东西,当AutoSize和WordWrap被启用时 我已经设法接近这一点: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
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。你的问题还提醒我,如果使用的样式与默认样式不同,这些度量可能会不同,因此我编辑了答案。好的,谢谢。我问你怎么知道宽度的原因是,我的应用程序将在不同的平台上运行,用户可能启用了一些设置,使大小有所不同,所以我必须在运行时获得理想的宽度。你的回答似乎涵盖了这一点。如果我遇到一些行为不端的情况,我会让你知道的。