加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:23:36 所属栏目:大数据 来源:网络整理
导读:我正在创建一个从TCustomControl派生的自定义控件,例如: type TMyCustomControl = class(TCustomControl)private FText: string; procedure SetText(const Value: string);protected procedure Paint; override;public constructor Create(AOwner: TCompone
我正在创建一个从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;

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

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

当我的组件被添加到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;

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

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读