Delphi 如何在构建期间在TPanel子体中设置标题?

Delphi 如何在构建期间在TPanel子体中设置标题?,delphi,vcl,Delphi,Vcl,我想在构建过程中清除标题,但这段代码并不像我预期的那样工作。 它不会将标题设置为空字符串。 如果我将“”(空格)分配给标题,它将保留,但这不是一个合适的解决方案 我正在使用Delphi 2006。尝试以下方法: TMyPanel = class(TPanel) public procedure AfterConstruction; override; end; procedure TMyPanel.AfterConstruction; begin inherited AfterCons

我想在构建过程中清除标题,但这段代码并不像我预期的那样工作。 它不会将标题设置为空字符串。 如果我将“”(空格)分配给标题,它将保留,但这不是一个合适的解决方案

我正在使用Delphi 2006。

尝试以下方法:

TMyPanel = class(TPanel)
public
  procedure AfterConstruction; override;
end;

procedure TMyPanel.AfterConstruction;
begin
  inherited AfterConstruction;
  Caption := '';
end;
经过测试,在XE2中工作正常

编辑:

在OP中显示的方法不起作用的情况下,这种方法起作用的原因是,在从DFM文件分配对象的特性值之后,调用了
Loaded

AfterConstruction
的重写调用发生在对象的初始创建之后,但在从表单的DFM分配属性值之前,这意味着您在
AfterConstruction
方法中指定的任何属性值都将立即替换为DFM中为该属性指定的任何值

加载的发生在施工订单的最后,因此您分配的任何值都将是最终值。

尝试以下操作:

TMyPanel = class(TPanel)
public
  procedure AfterConstruction; override;
end;

procedure TMyPanel.AfterConstruction;
begin
  inherited AfterConstruction;
  Caption := '';
end;
经过测试,在XE2中工作正常

编辑:

在OP中显示的方法不起作用的情况下,这种方法起作用的原因是,在从DFM文件分配对象的特性值之后,调用了
Loaded

AfterConstruction
的重写调用发生在对象的初始创建之后,但在从表单的DFM分配属性值之前,这意味着您在
AfterConstruction
方法中指定的任何属性值都将立即替换为DFM中为该属性指定的任何值


加载
发生在构造顺序的最末端,因此无论您指定什么值,都将是最终值。

如果标题在设计时间内不为空,则在构造过程中指定空字符串不会产生任何效果。如果您想要一个默认情况下在将其放到表单上时没有标题的面板,请参见此处:如果标题在designtime期间不为空,则在构造期间指定空字符串不会产生任何效果。如果您想要一个在将其放到表单上时默认没有标题的面板,请参见此处:谢谢,它可以工作!顺便问一下,为什么要分配EmptyStr而不是“”?文档中说它只是为了向后兼容而提供的。我使用EmptyStr是因为我讨厌在代码中定义字符串文字(即使它只是一个空字符串)。我宁愿让公共字符串定义一次,然后引用该常量/资源。@DavidHeffernan-answer扩展以解释其工作原理。感谢您的建议。Loaded的缺点是在运行时实例化组件时不会调用,因为这意味着不使用流系统。如果在继承调用之后(当一个组件被流式导入时,该调用也会进行流式处理),仍然与调用之前相同,我会使用构造函数并更改/重写该值(仅限)。是的,你是对的。然而,事实仍然是,只有当组件从dfm流式传输时,才会调用Loaded。所以你也不能依赖加载。谢谢,它很有效!顺便问一下,为什么要分配EmptyStr而不是“”?文档中说它只是为了向后兼容而提供的。我使用EmptyStr是因为我讨厌在代码中定义字符串文字(即使它只是一个空字符串)。我宁愿让公共字符串定义一次,然后引用该常量/资源。@DavidHeffernan-answer扩展以解释其工作原理。感谢您的建议。Loaded的缺点是在运行时实例化组件时不会调用,因为这意味着不使用流系统。如果在继承调用之后(当一个组件被流式导入时,该调用也会进行流式处理),仍然与调用之前相同,我会使用构造函数并更改/重写该值(仅限)。是的,你是对的。然而,事实仍然是,只有当组件从dfm流式传输时,才会调用Loaded。所以你也不能依赖于加载。