gpt4 book ai didi

delphi - TFrame.Create 中未执行代码

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

我使用以下代码创建了一个以 TFrame 作为祖先的组件:

type
TCHAdvFrame = class(TFrame)
private
{ Private declarations }
FOnShow : TNotifyEvent;
FOnCreate : TNotifyEvent;
protected
procedure CMShowingChanged(var M: TMessage); message CM_SHOWINGCHANGED;
public
{ Public declarations }
constructor Create(AOwner: TComponent) ; override;
published
property OnShow : TNotifyEvent read FOnShow write FOnShow;
property OnCreate : TNotifyEvent read FOnCreate write FOnCreate;
end;

implementation

{$R *.dfm}

{ TCHAdvFrame }

procedure TCHAdvFrame.CMShowingChanged(var M: TMessage);
begin
inherited;
if Assigned(OnShow) then
begin
ShowMessage('onShow');
OnShow(self);
end;
end;

constructor TCHAdvFrame.Create(AOwner: TComponent);
begin
ShowMessage('OnCreate1');
inherited ;
ShowMessage('OnCreate2');
if Assigned(OnCreate) then
begin
ShowMessage('OnCreate3');
OnCreate(self);
end;

我已经注册了新组件并做了一些测试。 ShowMessage('OnCreate1');和 ShowMessage('OnCreate2');正确执行但未执行 ShowMessage('OnCreate3');

这可以防止在实现 TCHAdvFrame 的新实例期间添加代码。

这是为什么?我该如何解决这个问题?

最佳答案

帧作为其最终所有者构造函数的一部分进行流式传输。通常这将是一个表格。该表单处理 .dfm 文件。它遇到新的对象并创建它们。然后它设置新创建的对象的属性。因此,框架的属性是在其构造函数返回后设置的。

这就是 TFrame 没有 OnCreate 事件的原因。根本无法触发该事件,因为该事件必然分配得太晚。 VCL 设计者省略此事件的原因与您提出此问题的原因相同。所以我确实怀疑您同样不应该添加此事件。

如何解决这个问题?除非我们对问题有更详细的描述,否则很难确定。也许您可以重写框架的 Loaded 方法以获得良好的效果。或者也许您需要做的就是让组件的使用者覆盖其派生框架中的构造函数。

相关阅读:http://delphi.about.com/od/delphitips2007/qt/tframe_oncreate.htm

关于delphi - TFrame.Create 中未执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26048323/

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