我希望按钮大小(宽度和高度)尽可能小,但我希望它适合文本.任何代码示例?
Delphi XE4 FireMonkey移动应用程序.
Delphi XE4 FireMonkey移动应用程序.
解决方法
FireMonkey使用
TTextLayout类通过方法呈现文本.我们可以通过类助手访问此方法,然后根据布局提供的信息更改按钮大小.
uses FMX.TextLayout; type TextHelper = class helper for TText function getLayout : TTextLayout; end; function TextHelper.getLayout; begin result := Self.fLayout; end; procedure ButtonAutoSize(Button : TButton); var bCaption : TText; m : TBounds; begin bCaption := TText(Button.FindStyleResource('text',false)); bCaption.HorzTextAlign := TTextAlign.taLeading; bCaption.VertTextAlign := TTextAlign.taLeading; m := bCaption.Margins; Button.Width := bCaption.getLayout.Width + m.Left + m.Right; Button.Height := bCaption.getLayout.Height + m.Top + m.Bottom; end; procedure TForm1.Button1Click(Sender: TObject); begin ButtonAutoSize(Sender as TButton); end;
更新
这是一个更加面向未来的解决方案,不需要公开私有类字段.
uses FMX.Objects; procedure ButtonAutoSizeEx(Button: TButton); var Bitmap: TBitmap; Margins: TBounds; Width,Height: Single; begin Bitmap := TBitmap.Create; Bitmap.Canvas.Font.Assign(Button.TextSettings.Font); Width := Bitmap.Canvas.TextWidth(Button.Text); Height := Bitmap.Canvas.TextHeight(Button.Text); Margins := (Button.FindStyleResource('text',false) as TText).Margins; Button.TextSettings.HorzAlign := TTextAlign.Leading; Button.Width := Width + Margins.Left + Margins.Right; Button.Height := Height + Margins.Top + Margins.Bottom; end;
此示例省略了任何自动换行或字符修剪.