在构造函数中获取组件名称?

5 delphi custom-component

我正在创建一个从TCustomControl派生的自定义控件,例如:

type
  TMyCustomControl = class(TCustomControl)
private
  FText: string;
  procedure SetText(const Value: string);
protected
  procedure Paint; override;
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
published
  property Text: string read FText write SetText;
end;
Run Code Online (Sandbox Code Playgroud)

注意,上述内容对于示例来说是不完整的,以保持简短.

无论如何,在我的控制下,我有一个Paint事件,它FText使用Canvas.TextOut 显示文本(来自字段).

当我的组件被添加到Delphi的窗体设计器(之前的任何用户可以改变对组件进行)我想TextOut显示组件的名称 - TButton的,TCheckBox,TPanel等与他们的caption属性的这样的例子.

如果我尝试在构造函数中将我的Component的名称分配给FText,它将返回空,例如'';

constructor TMyCustomControl.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FText  := Name; //< empty string
  ShowMessage(Name); //< empty message box too
end;
Run Code Online (Sandbox Code Playgroud)

如果我更改FText := NameFText := 'Name';它确实将文本输出到我的组件,所以我知道它不是实际代码中的问题,但显然这会输出'Name'而不是实际的组件名称,如MyCustomControl1,MyCustomControl2等.

所以我的问题是,如何从构造函数事件中获取Component的名称?

Rem*_*eau 6

Name构造函数运行时尚未分配该属性.在设计时,Name在控件的构造函数退出后,在将组件拖放到Designer之后,IDE会为该属性分配一个值.在运行时,该Name属性由DFM流系统设置,而后者也在构造函数退出后调用.

无论哪种方式,TControl.SetName()属性setter验证新值,然后将新值设置为控件的Text属性以匹配当前Text值与旧Name值匹配并且控件的ControlStyle属性包含csSetCaption标志(默认情况下它).当Text属性因任何原因发生更改时,控件会自动向自身发送CM_TEXTCHANGED通知.您可以让控件捕获该消息并Invalidate()自行调用以触​​发新的重绘.在你的Paint()处理程序内部,只需绘制当前的当前Name值,无论它恰好是什么值.如果它是空白的,那就这样吧.不要试图强迫Name,让VCL正常处理它.

  • @Blobby,关于文本定位的主题说明.确保计算与渲染时相同的文本的位置(如果你没有使用像`TextRect`这样的方法). (2认同)

And*_*and 5

我认为处理这个的正确方法是使用继承TextCaption属性TCustomControl,并确保csSetCaption ControlStyle设置.