gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:06:18 24 4
gpt4 key购买 nike

我正在创建一个从 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 等是其标题的示例属性。

如果我尝试在构造函数中将组件名称分配给 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'; 它确实会将文本输出到我的组件,所以我知道这不是问题实际的代码,但显然这会输出“名称”,而不是实际的组件名称,如 MyCustomControl1、MyCustomControl2 等。

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

最佳答案

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

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

关于delphi - 在构造函数中获取组件名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14567802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com