我使用以下代码创建了一个以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&#39);和ShowMessage(' OnCreate2');正确执行但不是ShowMessage(' OnCreate3');
这可以防止在实现TCHAdvFrame的新实例期间添加代码。
为什么,我该如何解决这个问题?
答案 0 :(得分:8)
框架作为其最终所有者构造函数的一部分进行流式处理。通常,这将是一种形式。表单处理.dfm文件。它遇到新对象并创建它们。然后它设置新创建的对象的属性。因此,框架的属性在其构造函数返回后设置。
这是TFrame
没有OnCreate
事件的原因。根本没有办法解雇事件,因为必要的事件分配太晚了。 VCL设计师因为导致您提出这个问题的相同原因而忽略了此事件。所以我怀疑你同样不应该添加这个事件。
如何解决这个问题?除非我们对问题有更详细的描述,否则很难确定。也许您可以覆盖框架的Loaded
方法以达到良好效果。或者您可能需要做的就是让组件的使用者覆盖其派生帧中的构造函数。
相关阅读:http://delphi.about.com/od/delphitips2007/qt/tframe_oncreate.htm