我希望动态创建具有固定宽度的Checkbox和Radiobutton(在FMX中,而不是VCL),以根据其包含的文本更改其Heigth。 我的复选框和Radiobuttons启用了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的区域不完全包含文本但以文本结尾有一些自由空间不是阻止,而只是左边界,但我不确定,这是重要还是如何处理。
答案 0 :(得分:3)
您可以使用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以保证安全。对于其他样式,此数字可能会有所不同。请参阅Position.X
的样式数据中text
成员的TRadioButton/TCheckBox
属性。
正如您在我的代码示例中所看到的,无需使用您使用的1.25因子进行任何调整。我的系统达到100%DPI,如果你是125%,它可以解释你的经历。如果这仍然是一个问题,您需要检查您运行的程序正在运行并根据需要进行补偿。
最后是带有2个宽度= 260和宽度= 400的单选按钮的表单图片。