Delphi Firemonkey:如何向自定义TRectangle组件添加文本?
在FireMonkey自定义TRectangle组件中添加文本的两种方案
嘿,刚上手FireMonkey的话,给继承自TRectangle的自定义组件加文本其实没那么复杂,我给你分享两种实用的思路:
方案一:直接嵌入TText子控件(最省心的方式)
这种方法不用自己写绘制逻辑,直接利用FireMonkey的控件嵌套特性,在自定义组件里内置一个TText控件:
- 首先在组件类里声明一个TText成员变量,然后在构造函数中初始化它:
type TMyCustomRectangle = class(TRectangle) private FText: TText; function GetText: string; procedure SetText(const Value: string); public constructor Create(AOwner: TComponent); override; published property Text: string read GetText write SetText; // 暴露成设计期可编辑的属性 end; constructor TMyCustomRectangle.Create(AOwner: TComponent); begin inherited; FText := TText.Create(Self); FText.Parent := Self; FText.Align := TAlignLayout.Client; // 让文本填充整个矩形区域 FText.TextAlign := TTextAlign.Center; // 水平居中 FText.VertTextAlign := TVertTextAlign.Center; // 垂直居中 FText.Font.Size := 14; FText.WordWrap := True; // 支持多行文本 end; function TMyCustomRectangle.GetText: string; begin Result := FText.Text; end; procedure TMyCustomRectangle.SetText(const Value: string); begin FText.Text := Value; end;
- 这样做的好处是,你可以在设计期直接通过Object Inspector修改Text属性,还能利用TText自带的所有样式设置(字体、颜色、换行等),完全不用操心绘制细节。
方案二:重写Paint方法手动绘制文本(更灵活的控制)
如果需要对文本的绘制逻辑做定制(比如根据组件状态改变文本颜色、自定义文本位置),可以重写TRectangle的Paint方法,在绘制完矩形后手动渲染文本:
- 先在组件类里声明文本变量和对应的属性:
type TMyCustomRectangle = class(TRectangle) private FCustomText: string; procedure SetCustomText(const Value: string); protected procedure Paint; override; published property CustomText: string read FCustomText write SetCustomText; end; procedure TMyCustomRectangle.SetCustomText(const Value: string); begin if FCustomText <> Value then begin FCustomText := Value; Repaint; // 修改文本后触发组件重绘 end; end;
- 然后重写Paint方法,完成文本绘制:
procedure TMyCustomRectangle.Paint; var LTextBounds: TRectF; begin inherited; // 先调用父类方法绘制矩形本身 // 计算文本的绘制范围,这里示例是居中显示 LTextBounds := RectF(0, 0, Width, Height); // 设置文本样式 Canvas.Font.Size := 16; Canvas.Fill.Color := TAlphaColors.White; // 绘制文本,最后两个参数控制对齐方式 Canvas.FillText(LTextBounds, FCustomText, False, 1, [], TTextAlign.Center, TVertTextAlign.Center); end;
- 这种方式适合需要高度定制的场景,比如你想让文本在组件被选中时变色,或者根据组件的尺寸动态调整字体大小,都可以在Paint方法里实现。
小提示
- 如果用方案一看不到文本,先检查TText的
Color属性是不是和矩形的Fill.Color冲突了(比如都是黑色),调整一下就能看到。 - 不管用哪种方案,记得把相关属性声明在
published段里,这样才能在设计期的Object Inspector中看到并编辑。
内容的提问来源于stack exchange,提问作者Alexander James
相关产品推荐
相关产品推荐

